2010-03-22 25 views
33

當我的PHP腳本從AJAX POST請求接收數據時,$_POST變量會被轉義。真奇怪的是,這隻發生在我的生產服務器上(在Linux上運行PHP 5.2.12),而不是在本地服務器上(在Windows上運行PHP 5.3.1)。

這裏是AJAX代碼:

var pageRequest = false; 
if(window.XMLHttpRequest)  pageRequest = new XMLHttpRequest(); 
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP"); 

pageRequest.onreadystatechange = function() { } 

var q_str = 'data=' + " ' "; 

pageRequest.open('POST','unnamed_page.php',true); 

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
pageRequest.setRequestHeader("Content-length", q_str.length); 
pageRequest.setRequestHeader("Connection", "close"); 

pageRequest.send(q_str); 

沒有任何理由,這是怎麼回事?我應該如何解決這個問題,以便它可以在兩臺服務器上運行?

編輯:我對magic_quotes的以下設置:

     Local Master 

magic_quotes_gpc  On  On 
magic_quotes_runtime Off  Off 
magic_quotes_sybase Off  Off 

回答

61

你可能已經在Linux服務器上啓用魔術引號:magic_quotes

當magic_quotes的是,所有'(單引號),「(雙引號),\(反斜線)並且NUL會自動以反斜槓轉義。

它們是禁用的好東西,因爲它們將從PHP 6開始被移除。 您還應該能夠在腳本中禁用它們: set-magic-quotes-runtime 您不能在運行時禁用負責轉義POST數據的magic_quotes部分。如果可以,請在php.ini中禁用它。如果你不能做到這一點,做一個檢查magic_quotes的是否已啓用,並做了stripslashes()函數上的任何內容從POST獲取:

if (get_magic_quotes_gpc()) 
$my_post_var = stripslashes($_POST["my_post_var"]); 
+0

這不會破壞我的本地服務器?只是想確保我得到這個...... – 2010-03-22 23:28:44

+0

@George如果你按照描述進行檢查,它將與你的本地服務器一起工作,因爲'get_magic_quotes_gpc()'將在那裏返回false,並且沒有斜線將被剝離。嘗試一下,做一個測試輸出的函數,但最好的辦法是禁用linux機器上的魔術引號,你可以做一個'phpinfo()',它會告訴你什麼是啓用的,哪些不是。 – 2010-03-22 23:31:03

+1

@George這是一個安全措施,通過用斜槓自動轉義相關數據來防止SQL注入。基本上不是一個壞主意,但它從來沒有抓到過並且最終成爲您的案例所展示的麻煩。 – 2010-03-22 23:32:18

2

也許你的Linux服務器的php.ini文件,使魔術引號。

http://php.net/manual/en/security.magicquotes.php

這是不好的,當然,作爲功能已被棄用,將在即將PHP被刪除6.

您可以在php.ini中禁用它,像這樣

magic_quotes_gpc = Off 

如果您無法訪問您的php.ini,則可以在運行時測試並禁用它。

<?php 
if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
    unset($process); 
} 
?> 

PHP Manual

+0

我該如何解決這個問題?我不能編輯在生產服務器上的php.ini。 – 2010-03-22 23:23:30

+0

檢查代碼示例,或通過點擊手動鏈接,更多的閱讀。 – alex 2010-03-22 23:24:32

4

您可能遇到魔術引號在生產環境中開啓。檢查phpinfo()輸出。

您可以通過像這樣運行的所有的輸入剝去引號:

 /* strip slashes from the string if magic quotes are on */ 
    static function strip_magic_slashes($str) 
    { 
      return get_magic_quotes_gpc() ? stripslashes($str) : $str; 
    } 
+1

我檢查了phpinfo():果然,它在生產服務器上啓用。 – 2010-03-22 23:30:21

25

我不認爲這也適用於你的情況,但我只是有類似的問題。我正在加載一個Wordpress安裝以及一個網站,所以我可以在所有頁面上顯示最近的帖子。事實證明,無論magic_quotes設置爲什麼,Wordpress都會轉義所有$ _POST變量。

我提到它是因爲找出答案令人沮喪,並且在Google上找到了一個答案。

以下是我固定它在我的情況:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; // loading wordpress 
$_POST = $temp_POST;
+0

3年後,它仍然在WP 3.7中不固定。 – biziclop 2013-10-28 06:48:12

+1

也許這是一個功能,而不是一個錯誤。在wp-settings.php中調用wp_magic_quotes()方法,該方法在wp-includes/load.php中定義。這種方法可以確保WordPress內部的所有參數都被引用,而不管Magic Quotes。 – 2014-06-10 17:33:44

+2

我認爲更準確的描述是「有人將其視爲功能,但沒有考慮到後果,所以現在這是一個其他人的錯誤」可以很容易地通過wordpress複製POST vars自己使用,然後逃避他們在那裏,而不是改變POST中的實際內容,即wordpress以外的任何內容都必須處理這些更改。 – 2015-03-27 18:48:27

0

所以我也跟一個WordPress的開發(https://core.trac.wordpress.org/ticket/40476#ticket),他說:

「早在一天,許多很久以前, WordPress在接受所有超級全局值時都會被削減 PHP後來對這個想法進行了反轉,使其更加理智,但是損壞已經完成,WordPress作爲一個應用程序存在了足夠長的時間,並有足夠的現有插件和主題依靠WordPress創建一個理智的單一環境意思是WordPress也在改變,這些網站會造成不可挽回的損失 - 引入安全漏洞,破壞內容和其他一些有趣的事情。 https://core.trac.wordpress.org/ticket/18322是我們追蹤這個並獲得更多理智的票 - 在短期(和更長期)我們會要求如果您訪問$ _POST變量,您可以這樣做:$ myvar = wp_unslash($ _POST [ 'variable']);所以有一天,我們可以將$ _POST作爲一個未分組的數組。

關於這裏給出了答案:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; 
$_POST = $temp_POST; 

請不要那樣做。你只是開放自己的安全問題,併發生意想不到的事情發生在你的內容WordPress預計價值被削減。 相反,只需使用wp_unslash(),如果您確實需要$ _POST的副本來對自己進行操作,請按如下操作:$my_POST = wp_unslash($_POST);

我還應該補充 - 我希望你這樣做是因爲你正在嘗試使用API​​端點來處理某些事情,我強烈建議改用使用WordPress 4.7中引入的REST API來替代,因爲它可以讓我們爲開發人員提供更一致的體驗。 「