php.ini中Magic_Quotes_Gpc開關設置

  1. Magic_Quotes_Gpc 解釋php

    magic_quotes_gpc做用範圍是:WEB客戶服務端;做用時間:請求開始時。mysql

    magic_quotes_runtime 做用範圍:從文件中讀取的數據或執行exec()的結果或是從SQL查詢中獲得的;做用時間:每次當腳本訪問運行狀態中產生的數據
    sql

  2. 開關區別數據庫

    2.1    對於PHP magic_quotes_gpc=on的狀況, 咱們能夠不對輸入和輸出數據庫的字符串數據做addslashes()和stripslashes()的操做,數據也會正常顯示。數組

        若是此時你對輸入的數據做了addslashes()處理,那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜槓安全

    例如:函數

    1)條件: PHP magic_quotes_gpc=onspa

    寫入數據庫的字符串未通過任何處理。從數據庫讀出的字符串未做任何處理。code

    數據:  $data=」snow」’’sun」 ; (snow和sun之間是四個連續的單引號).htm

    操做: 將字符串:」snow」’’sun」 寫入數據庫,

    結果: sql語句順利執行,數據成功寫入數據庫

    數據庫保存格式:snow」’’sun (和輸入同樣)

    輸出數據格式:snow」’’sun (和輸入同樣)

    說明: PHP magic_quotes_gpc=on 將單引號轉換爲\’的轉義字符使sql語句成功執行,

    但\’並未做爲數據入數據庫,數據庫保存的是snow」’’sun而並非咱們想象的snow\’\’\’\’sun。

    2) 條件: PHP magic_quotes_gpc=on

    寫入數據庫的字符串通過函數addlashes()處理。從數據庫讀出的字符串未做任何處理。

    數據:  $data=」snow」’’sun」 ; (snow和sun之間是四個連續的單引號).

    操做: 將字符串:」snow」’’sun」 寫入數據庫,

    結果: sql語句順利執行,數據成功寫入數據庫

    數據庫保存格式:snow\’\’\’\’sun (添加了轉義字符)

    輸出數據格式:snow\’\’\’\’sun (添加了轉義字符)

    說明: PHP magic_quotes_gpc=on 將單引號轉換爲\’的轉義字符使sql語句成功執行,

    addslashes又將即將寫入數據庫的單引號轉換爲\’,後者的轉換被做爲數據寫入

    數據庫,數據庫保存的是snow\’\’\’\’sun

    2.2    對於PHP magic_quotes_gpc=off 的狀況

    必須使用addslashes()對輸入數據進行處理,但並不須要使用stripslashes()格式化輸出,由於addslashes()並未將反斜槓一塊兒寫入數據庫,只是幫助mysql完成了sql語句的執行。

例如:

    1)條件: PHP magic_quotes_gpc=off

    寫入數據庫的字符串未通過任何過濾處理。從數據庫讀出的字符串也未做任何處理。

    數據:  $data=」snow」’’sun」 ; (snow和sun之間是四個連續的單引號).

    操做: 將字符串:」snow」’’sun」 寫入數據庫,

    結果: 出現sql語句錯誤,mysql不能順利完成sql語句,寫入數據庫失敗。

    數據庫保存格式:無數據。

    輸出數據格式:無數據。

    說明: 對於未經處理的單引號在寫入數據庫時會使sql語句發生錯誤。

    2)條件: PHP magic_quotes_gpc=off

    寫入數據庫的字符串通過函數addslashes()處理。從數據庫讀出的字符串未做任何處理。

    數據:  $data=」snow」’’sun」 ; (snow和sun之間是四個連續的單引號).

    操做: 將字符串:」snow」’’sun」 寫入數據庫,

    結果: sql語句順利執行,數據成功寫入數據庫

    數據庫保存格式:snow」’’sun (和輸入同樣)

    輸出數據格式:snow」’’sun (和輸入同樣)

    說明: addslashes()函數將單引號轉換爲\’的轉義字符使sql語句成功執行,

    但\’並未做爲數據存入數據庫,數據庫保存的是snow」’’sun 而並非咱們想象的snow\’\’\’\’sun

    3. 產生的問題及解決方法

    1)若是發現php.ini配置爲不給GPC變量自動添加轉義斜線,則PHP自動爲GPC添加轉義斜線。可是事實上,這是錯誤的,由於它改變了GPC變量原來的值。有這個遺留習慣的緣由是PHP程序使用每每配合mysql, 而mysql對特殊字符的轉義,採起的是添加轉義斜線,但若是使用其它類型數據庫,如mssql,oci,sybase 那麼,給GPC添加轉義斜線,更是個錯誤;進一步,若是GPC數據不須要存入數據庫,而保存到文件系統,或轉發給其它程序呢?更是很嚴重的錯誤邏輯。

正確的作法是:
1.PHP程序入口去掉轉義斜線(若php.ini配置爲自動添加轉義斜線)
2.在寫入mysql時,使用mysql_real_escape_string而不是addcslashes來轉義變量
由於前者比後者更爲安全(字符集相關的)

3. 經過get_magic_quotes_gpc()函數獲取magic_quotes_gpc參數配置狀況,根據配置進行操做。

//若是magic_quotes_gpc=Off,那就爲提單提交的$_POST['message']裏的敏感字符加反斜槓
//magic_quotes_gpc=On的狀況下,則不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}

4.擴展該方法

function quotes($content)
{
//若是magic_quotes_gpc=Off,那麼就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否爲數組
if (is_array($content)) {
//若是$content是數組,那麼就處理它的每個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//若是$content不是數組,那麼就僅處理一次
addslashes($content);
}
} else {
//若是magic_quotes_gpc=On,那麼就不處理
}
//返回$content
return $content;
}

綜述一下:
1.針對系統管理員,應該配置php.ini
magic_quotes_gpc=Off
magic_quotes_runtime=Off
magic_quotes_sybase=Off
針對php開發人員,更準確的邏輯:
1.檢查php環境是否配置爲自動添加轉義斜線,如果,應該調用stripslashes去掉$_REQUEST, $_GET,$_POST,$_COOKIE的轉義斜線
2.查詢/寫入/修改數據至mysql時,再使用mysql_real_escape_string轉義之

注意:

這個特性在PHP5.3.0中已經廢棄而且在5.4.0中已經移除了(This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.)。因此沒有理由再使用魔術引號,由於它再也不是 PHP 支持的一部分。 不過它幫助了新手在不知不覺中寫出了更好(更安全)的代碼。 可是在處理代碼的時候,最好是更改你的代碼而不是依賴於魔術引號的開啓。

相關文章
相關標籤/搜索