不受魔術引號影響的PHP應用
阿新 • • 發佈:2019-02-06
PHP之安全在於其預設配置php.ini-dist中具備一個magic_quotes_gpc = On的東西,叫“魔術引號(Magic Quote)”,對PHP初學者很有用,“儘管SQL注入在魔術引號開啟的情況下仍然有可能實現,但起碼系統的風險減少很多了”(PHP手冊)。但是對於 PHP程式碼的移植性卻造成了影響,而且並不是每一個被魔術引號轉義的資料都需要寫入資料庫,這樣就對程式的執行效率造成了影響,倒不如使用 addslashes(),所以在php.ini-recommended中magic_quotes_gpc = Off。
這裡用一段函式來判斷是否打開了magic_quotes_gpc,然後確定是否需要addslashes(),當然,這樣做可能效率會受到影響。
PHP系統配置檔案php.ini中有三個魔術引號配置選項:
魔術引號配置選項 | 描述 | 執行時改變 | PHP中的預設值 |
magic_quotes_gpc | 如果開啟的話,影響到 HTTP 請求資料(GET,POST 和 COOKIE)。 | NO | On |
magic_quotes_runtime | 如果開啟的話,大部份從外部來源取得資料並返回的函式,包括從資料庫和文字檔案,所返回的資料都會被反斜線轉義。(前提是magic_quotes_gpc = On) | YES | Off |
magic_quotes_sybase | 當關閉時,所有的 '(單引號),"(雙引號),/(反斜線)和 NULL 字元都會被自動加上一個反斜線進行轉義。這和 addslashes() 作用完全相同。 如果開啟的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時開啟兩個選項的話,單引號將會被轉義成 ''。而雙引號、反斜線 和 NULL 字元將不會進行轉義。 (前提是magic_quotes_gpc = On) |
YES | Off |
從上表可以看出,對於magic_quotes_runtime,在程式中用 ini_set('magic_quotes_runtime', 0);就可以把它關掉,然後可以用自己的方法來處理來自資料庫或檔案的資料。
但是要處理外部傳來的全域性變數就比較麻煩了。下面的程式碼可供使用,這裡將遮蔽magic_quotes_sybase,只是將引號之類的東西前面加上反斜線(/),用於提交給MySql資料庫。
PHP程式碼- function quotesOuterVars($var) {
- if (is_array($var)) {
- returnarray_map('quotesOuterVars',$var);
- } else {
- if (get_magic_quotes_gpc()) {
- // 如果 magic_quotes_sybase=On,我們先把 '' 替換成 ',然後再addslashes
- if (ini_get('magic_quotes_sybase')) {
- $var = str_replace("''", "'", $var);
- $var = addslashes($var);
- }
- } else{
- $var = addslashes($var);
- }
- return trim($var);
- }
- }