2011-07-10 19 views
5

我的服務器管理員最近升級到PHP 5.3,我得到一個奇怪的「錯誤」(或PHP的人有它的feature)。爲了明顯的安全原因,我的大部分字符串表單數據都有mysql_real_escape_string,但現在看來這個轉義已經由PHP完成了。

<?php 

echo $_GET["escaped"]; 

?> 

<form method="get"> 
    <input type="text" name="escaped" /> 
</form> 

此輸出,如果我例如escape 'this test'escape \'this test\'進入。如果我使用POST而不是GET,也是如此。

它是直接綁定到5.3升級還是我的管理員可以觸發php.ini文件中的自動切換?另外,我應該如何保持它(如果它確實是一個很好的失敗證明機制,能正確捕獲所有的get和post變量),或者我應該禁用它(如果這甚至是可能的!)並去回到mysql_real_escape_string?我的膽量告訴我方法2是最好的,但方法1會有些自動化。 :)

編輯:其實,我需要禁用它。有時我會收集表單數據,並在發生錯誤的情況下將其重新發送給客戶表單(即缺少字段),所以我不希望他/她的斜槓出現在任何地方。

+0

還應該注意的是,如果你的'php.ini'文件包含語法錯誤,默認是啓用'magic_quotes_gpc'。因此,如果您認爲您已在配置文件中禁用了'magic_quotes_gpc',則文件可能包含錯誤,導致您的配置無法應用。個人經驗。 :P –

回答

11

http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc選項「功能」被稱爲magic_quotes_gpc並且不是保護您免受所有SQL注入攻擊(addslashes在輸入超全局的每個元素上調用,例如$_POST$_GET。這忽略了實際的輸入/數據庫編碼)。因此不推薦使用should not be used

官方的PHP手冊includes a neat way to undo it in php code,但你應該只是關掉它

+0

消除它的「簡潔」方式很慢,它是O(n),不算太糟,但仍然可能導致巨大輸入的問題。 –

+0

@Nicklas A.它可能很慢,但一見鍾情,這似乎是解除魔術引號最快的方法。您能否詳細說明如何改進這些代碼?如果'n'是整個POST主體的大小,*任何*算法撤銷文本編碼將花費O(n),不是嗎? – phihag

+0

不,當然沒有其他解決方案。我只是意味着修改php.ini是一個更好的解決方案:) –

6

這是由於magic quotes,你應該關閉它。

這裏是你如何把它關掉:http://www.php.net/manual/en/security.magicquotes.disabling.php

你要麼通過php.ini中或通過$_GET$_POST去除所有變量斜線做到這一點,顯然前者是推薦的路要走。


正如威爾·馬丁建議,您還可以通過.htaccess這樣的改變:

 
php_flag magic_quotes_gpc off 

此處瞭解詳情:http://php.net/manual/en/configuration.changes.php

+0

S/O讓我接受。從來沒有想過這樣一個瘋狂的「功能」可能存在。問我的管理員禁用它,因爲可悲的是,ini_set不起作用。格兒。 – Lazlo

+0

ini_set僅適用於腳本解析後發生的內容,可惜之前發生了轉義。魔術引號是邪惡的,只會導致問題,永遠不會解決它們。特別是當人們可能依靠他們的東西。 –

+2

您可以使用.htaccess將其禁用 - 這在分析頁面之前發生。 '.php_flag magic_quotes_gpc Off'在你的.htaccess中。 –