2010-03-15 47 views
2

今天我遇到了一些奇怪的PHP,我沒有在文檔中找到合適的解釋。考慮下面的代碼:爲什麼PHP中的_GET錯誤地解碼斜線?

<?php 
echo $_GET['t']. PHP_EOL; 
?> 

該代碼很簡單 - 它只需要一個單一的參數在url上並輸出回來。 ?所以,如果你用test.php的牛逼稱之爲=%5CA(%5C是 '\'),我期望看到:

\a 

然而,這是我得到了什麼:

$ curl http://localhost/~boaz/test.php?t=%5Ca 
\\a 

注意雙斜線。任何人都可以解釋發生了什麼,並提供檢索URL中提供的字符串的配方?

感謝, 波阿斯

PS。我正在使用PHP 5.2.11

回答

6

發生這種情況是因爲您在php.ini中打開了「magic quotes」開關。從手冊:

當打開時,所有的'(單引號),「 (雙引號),\(反斜線)和NULL 人物會自動用一個 反斜線這是 等同於什麼。addslashes()作用

瞭解更多關於在這裏:​​http://php.net/manual/en/security.magicquotes.php

使你的腳本知道在php.ini中設置的「magic_quotes_gpc的」任何價值的,你可以寫你的腳本是這樣的:

$d = $_GET["d"]; 
if (get_magic_quotes_gpc()) $d = stripslashes($d); 
echo $d; //but now you are kind of vulnerable to SQL injections 
     //if you don't properly escape this value in SQL queries. 
+0

可以通過使用stripslashes()函數來治癒 – 2010-03-15 15:39:53

+0

你很容易受到SQL注入。您應該始終使用參數化查詢。沒有理由。 – Kibbee 2010-03-15 15:59:18

+0

Magic_quotes將會在PHP 6中被刪除,所以最好不要依賴它。 – 2010-03-15 16:03:45

0

您可以使用strip_slashes()函數輕鬆修復此問題。你應該避免使用魔術引號;出於安全原因,它們已被棄用。如果你是依賴於魔術引號來保護你

0

打開.htaccess文件,並把這樣的事情

php_flag magic_quotes_gpc off 
php_flag magic_quotes_runtime off