1. 程式人生 > >不受魔術引號影響的PHP應用

不受魔術引號影響的PHP應用

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程式碼
  1. function quotesOuterVars($var) {
  2. if (is_array($var)) {
  3. returnarray_map('quotesOuterVars',$var);
  4.      } else {
  5. if (get_magic_quotes_gpc()) {
  6. // 如果 magic_quotes_sybase=On,我們先把 '' 替換成 ',然後再addslashes
  7. if (ini_get('magic_quotes_sybase')) {
  8.                  $var = str_replace("''", "'", $var);
  9. $var = addslashes($var);
  10.              }
  11.          } else{
  12. $var = addslashes($var);
  13.          }
  14. return trim($var);
  15.      }
  16. }