php magic_quotes_gpc的一點(diǎn)認(rèn)識(shí)與分析
更新時(shí)間:2008年08月18日 20:30:48 作者:
最近一直在做一個(gè)文章發(fā)布系統(tǒng),做了改,改了做,一直到現(xiàn)在還沒竣工....
為了達(dá)到更好的兼容性,其中的程序涉及到了magic_quotes_gpc,看了下手冊(cè),又找了些資料,分析了下,分享給大家。
blankyao 說“學(xué)習(xí)的過程就是不斷的發(fā)現(xiàn)錯(cuò)誤,不斷的改正錯(cuò)誤”;
先看下手冊(cè)上怎么說的吧!
對(duì)一般人來說看下前兩段就可以了
Magic Quotes
代碼:
Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed.
What are Magic Quotes
代碼:
When on, all ' (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.
There are three magic quote directives:
magic_quotes_gpc
代碼:
Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.
magic_quotes_runtime
代碼:
If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP.
magic_quotes_sybase
代碼:
If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ''. Double quotes, backslashes and NULL's will remain untouched and unescaped.
Why use Magic Quotes
1 Useful for beginners
Magic quotes are implemented in PHP to help code written by beginners from being dangerous. Although SQL Injection is still possible with magic quotes on, the risk is reduced.
2Convenience
For inserting data into a database, magic quotes essentially runs addslashes() on all Get, Post, and Cookie data, and does so automagically.
Why not to use Magic Quotes
1 Portability
代碼:
Assuming it to be on, or off, affects portability. Use get_magic_quotes_gpc() to check for this, and code accordingly.
2 Performance
代碼:
Because not every piece of escaped data is inserted into a database, there is a performance loss for escaping all this data. Simply calling on the escaping functions (like addslashes()) at runtime is more efficient.
Although php.ini-dist enables these directives by default, php.ini-recommended disables it. This recommendation is mainly due to performance reasons.
3 Inconvenience
代碼:
Because not all data needs escaping, it's often annoying to see escaped data where it shouldn't be. For example, emailing from a form, and seeing a bunch of \' within the email. To fix, this may require excessive use of stripslashes().
這些英文實(shí)在是需要像我這類人有足夠的耐心?。ú皇钦f我有耐心,而是我英語(yǔ)爛),剛才也說了,對(duì)于一般人只看下前兩段就可以了,特別是我用紅色標(biāo)出來的字!??!
另外,特別注意的是,魔術(shù)引用發(fā)生作用是在傳遞$_GET,$_POST,$_COOKIE時(shí)
下面是案例
代碼:
1.
條件: magic_quotes_gpc=off
寫入數(shù)據(jù)庫(kù)的字符串未經(jīng)過任何過濾處理。從數(shù)據(jù)庫(kù)讀出的字符串也未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: 出現(xiàn)sql語(yǔ)句錯(cuò)誤,mysql不能順利完成sql語(yǔ)句,寫入數(shù)據(jù)庫(kù)失敗。
數(shù)據(jù)庫(kù)保存格式:無數(shù)據(jù)。
輸出數(shù)據(jù)格式:無數(shù)據(jù)。
說明: 對(duì)于未經(jīng)處理的單引號(hào)在寫入數(shù)據(jù)庫(kù)時(shí)會(huì)使sql語(yǔ)句發(fā)生錯(cuò)誤。
代碼:
2.
條件: magic_quotes_gpc=off
寫入數(shù)據(jù)庫(kù)的字符串經(jīng)過函數(shù)addslashes()處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow''''sun (和輸入一樣)
輸出數(shù)據(jù)格式:snow''''sun (和輸入一樣)
說明: addslashes()函數(shù)將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
但\'并未作為數(shù)據(jù)存入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow''''sun 而并不是我們想象的snow\'\'\'\'sun
代碼:
3.
條件: magic_quotes_gpc=on
寫入數(shù)據(jù)庫(kù)的字符串未經(jīng)過任何處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow''''sun (和輸入一樣)
輸出數(shù)據(jù)格式:snow''''sun (和輸入一樣)
說明: magic_quotes_gpc=on 將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
但\'并未作為數(shù)據(jù)入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow''''sun而并不是我們想象的snow\'\'\'\'sun。
代碼:
4.
條件: magic_quotes_gpc=on
寫入數(shù)據(jù)庫(kù)的字符串經(jīng)過函數(shù)addlashes()處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow\'\'\'\'sun (添加了轉(zhuǎn)義字符)
輸出數(shù)據(jù)格式:snow\'\'\'\'sun (添加了轉(zhuǎn)義字符)
說明: magic_quotes_gpc=on 將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
addslashes又將即將寫入數(shù)據(jù)庫(kù)的單引號(hào)轉(zhuǎn)換為\',后者的轉(zhuǎn)換被作為數(shù)據(jù)寫入
數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow\'\'\'\'sun
總結(jié)如下:
1. 對(duì)于magic_quotes_gpc=on的情況,
我們可以不對(duì)輸入和輸出數(shù)據(jù)庫(kù)的字符串?dāng)?shù)據(jù)作
addslashes()和stripslashes()的操作,數(shù)據(jù)也會(huì)正常顯示。
如果此時(shí)你對(duì)輸入的數(shù)據(jù)作了addslashes()處理,
那么在輸出的時(shí)候就必須使用stripslashes()去掉多余的反斜杠。
2. 對(duì)于magic_quotes_gpc=off 的情況
必須使用addslashes()對(duì)輸入數(shù)據(jù)進(jìn)行處理,但并不需要使用stripslashes()格式化輸出
因?yàn)閍ddslashes()并未將反斜杠一起寫入數(shù)據(jù)庫(kù),只是幫助mysql完成了sql語(yǔ)句的執(zhí)行。
補(bǔ)充:
magic_quotes_gpc 作用范圍是:WEB客戶服務(wù)端;作用時(shí)間:請(qǐng)求開始時(shí),例如當(dāng)腳本運(yùn)行時(shí).
magic_quotes_runtime 作用范圍:從文件中讀取的數(shù)據(jù)或執(zhí)行exec()的結(jié)果或是從SQL查詢中得到的;作用時(shí)間:每次當(dāng)腳本訪問運(yùn)行狀態(tài)中產(chǎn)生的數(shù)據(jù)
先看下手冊(cè)上怎么說的吧!
對(duì)一般人來說看下前兩段就可以了
Magic Quotes
代碼:
Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed.
What are Magic Quotes
代碼:
When on, all ' (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.
There are three magic quote directives:
magic_quotes_gpc
代碼:
Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.
magic_quotes_runtime
代碼:
If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP.
magic_quotes_sybase
代碼:
If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ''. Double quotes, backslashes and NULL's will remain untouched and unescaped.
Why use Magic Quotes
1 Useful for beginners
Magic quotes are implemented in PHP to help code written by beginners from being dangerous. Although SQL Injection is still possible with magic quotes on, the risk is reduced.
2Convenience
For inserting data into a database, magic quotes essentially runs addslashes() on all Get, Post, and Cookie data, and does so automagically.
Why not to use Magic Quotes
1 Portability
代碼:
Assuming it to be on, or off, affects portability. Use get_magic_quotes_gpc() to check for this, and code accordingly.
2 Performance
代碼:
Because not every piece of escaped data is inserted into a database, there is a performance loss for escaping all this data. Simply calling on the escaping functions (like addslashes()) at runtime is more efficient.
Although php.ini-dist enables these directives by default, php.ini-recommended disables it. This recommendation is mainly due to performance reasons.
3 Inconvenience
代碼:
Because not all data needs escaping, it's often annoying to see escaped data where it shouldn't be. For example, emailing from a form, and seeing a bunch of \' within the email. To fix, this may require excessive use of stripslashes().
這些英文實(shí)在是需要像我這類人有足夠的耐心?。ú皇钦f我有耐心,而是我英語(yǔ)爛),剛才也說了,對(duì)于一般人只看下前兩段就可以了,特別是我用紅色標(biāo)出來的字!??!
另外,特別注意的是,魔術(shù)引用發(fā)生作用是在傳遞$_GET,$_POST,$_COOKIE時(shí)
下面是案例
代碼:
1.
條件: magic_quotes_gpc=off
寫入數(shù)據(jù)庫(kù)的字符串未經(jīng)過任何過濾處理。從數(shù)據(jù)庫(kù)讀出的字符串也未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: 出現(xiàn)sql語(yǔ)句錯(cuò)誤,mysql不能順利完成sql語(yǔ)句,寫入數(shù)據(jù)庫(kù)失敗。
數(shù)據(jù)庫(kù)保存格式:無數(shù)據(jù)。
輸出數(shù)據(jù)格式:無數(shù)據(jù)。
說明: 對(duì)于未經(jīng)處理的單引號(hào)在寫入數(shù)據(jù)庫(kù)時(shí)會(huì)使sql語(yǔ)句發(fā)生錯(cuò)誤。
代碼:
2.
條件: magic_quotes_gpc=off
寫入數(shù)據(jù)庫(kù)的字符串經(jīng)過函數(shù)addslashes()處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow''''sun (和輸入一樣)
輸出數(shù)據(jù)格式:snow''''sun (和輸入一樣)
說明: addslashes()函數(shù)將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
但\'并未作為數(shù)據(jù)存入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow''''sun 而并不是我們想象的snow\'\'\'\'sun
代碼:
3.
條件: magic_quotes_gpc=on
寫入數(shù)據(jù)庫(kù)的字符串未經(jīng)過任何處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow''''sun (和輸入一樣)
輸出數(shù)據(jù)格式:snow''''sun (和輸入一樣)
說明: magic_quotes_gpc=on 將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
但\'并未作為數(shù)據(jù)入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow''''sun而并不是我們想象的snow\'\'\'\'sun。
代碼:
4.
條件: magic_quotes_gpc=on
寫入數(shù)據(jù)庫(kù)的字符串經(jīng)過函數(shù)addlashes()處理。從數(shù)據(jù)庫(kù)讀出的字符串未作任何處理。
數(shù)據(jù):  $data="snow''''sun" ; (snow和sun之間是四個(gè)連續(xù)的單引號(hào)).
操作: 將字符串:"snow''''sun" 寫入數(shù)據(jù)庫(kù),
結(jié)果: sql語(yǔ)句順利執(zhí)行,數(shù)據(jù)成功寫入數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)保存格式:snow\'\'\'\'sun (添加了轉(zhuǎn)義字符)
輸出數(shù)據(jù)格式:snow\'\'\'\'sun (添加了轉(zhuǎn)義字符)
說明: magic_quotes_gpc=on 將單引號(hào)轉(zhuǎn)換為\'的轉(zhuǎn)義字符使sql語(yǔ)句成功執(zhí)行,
addslashes又將即將寫入數(shù)據(jù)庫(kù)的單引號(hào)轉(zhuǎn)換為\',后者的轉(zhuǎn)換被作為數(shù)據(jù)寫入
數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)保存的是snow\'\'\'\'sun
總結(jié)如下:
1. 對(duì)于magic_quotes_gpc=on的情況,
我們可以不對(duì)輸入和輸出數(shù)據(jù)庫(kù)的字符串?dāng)?shù)據(jù)作
addslashes()和stripslashes()的操作,數(shù)據(jù)也會(huì)正常顯示。
如果此時(shí)你對(duì)輸入的數(shù)據(jù)作了addslashes()處理,
那么在輸出的時(shí)候就必須使用stripslashes()去掉多余的反斜杠。
2. 對(duì)于magic_quotes_gpc=off 的情況
必須使用addslashes()對(duì)輸入數(shù)據(jù)進(jìn)行處理,但并不需要使用stripslashes()格式化輸出
因?yàn)閍ddslashes()并未將反斜杠一起寫入數(shù)據(jù)庫(kù),只是幫助mysql完成了sql語(yǔ)句的執(zhí)行。
補(bǔ)充:
magic_quotes_gpc 作用范圍是:WEB客戶服務(wù)端;作用時(shí)間:請(qǐng)求開始時(shí),例如當(dāng)腳本運(yùn)行時(shí).
magic_quotes_runtime 作用范圍:從文件中讀取的數(shù)據(jù)或執(zhí)行exec()的結(jié)果或是從SQL查詢中得到的;作用時(shí)間:每次當(dāng)腳本訪問運(yùn)行狀態(tài)中產(chǎn)生的數(shù)據(jù)
您可能感興趣的文章:
- 解析PHP留言本模塊主要功能的函數(shù)說明(代碼可實(shí)現(xiàn))
- PHP函數(shù)篇詳解十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制轉(zhuǎn)換函數(shù)說明
- PHP訪問MYSQL數(shù)據(jù)庫(kù)封裝類(附函數(shù)說明)
- php 數(shù)組操作(增加,刪除,查詢,排序)等函數(shù)說明
- php中magic_quotes_gpc對(duì)unserialize的影響分析
- 基于PHP magic_quotes_gpc的使用方法詳解
- PHP5下$_SERVER變量不再受magic_quotes_gpc保護(hù)的彌補(bǔ)方法
- PHP 字符串正則替換函數(shù)preg_replace使用說明
- php array_map()數(shù)組函數(shù)使用說明
- PHP中simplexml_load_string函數(shù)使用說明
- php中g(shù)et_magic_quotes_gpc()函數(shù)說明
相關(guān)文章
PHP中創(chuàng)建空文件的代碼[file_put_contents vs touch]
php中用file_put_contents比touch快,大約兩倍左右。2012-01-01windows服務(wù)器中檢測(cè)PHP SSL是否開啟以及開啟SSL的方法
這篇文章主要介紹了windows服務(wù)器中檢測(cè)PHP SSL是否開啟以及開啟SSL的方法,需要的朋友可以參考下2014-04-04由php的call_user_func傳reference引發(fā)的思考
由php的call_user_func傳reference引發(fā)的思考,使用call_user_func傳reference的朋友可以參考下。2010-07-07