2014-10-19 53 views
0

因此,PHP在處理字符串中的字符最近在我的一個項目中遇到了很多麻煩,我認爲背後的主要原因這是由於一些瘋狂的原因,它將\字符加倍。我已經檢查過,並且魔術引號已關閉(所以這不是罪魁禍首)。不管怎麼說,給出下面的代碼:PHP是加倍字符(這是打破mysql_real_escape_string,PDO->報價等)

26 $comments = $_POST['comments']; 
27 error_log("comments: '$comments'"); 
28 $comments = mysql_real_escape_string($_POST['comments']); 
29 error_log("escaped comments: '$comments'"); 

我看到在錯誤日誌如下:

[Sun Oct 19 14:18:53 2014] [error] [client XXXX] comments: 'something elsewearwerawer's woeimrowiamrw', referer: ... 
[Sun Oct 19 14:18:53 2014] [error] [client XXXX] comments escaped: 'something elsewearwerawer\\'s woeimrowiamrw', referer: ... 

更糟糕的是,我仍然看到了以PDO交換的東西后,相同的行爲:

error_log("quoted: '" . $db_pdo->quote($comments) . "'"); 

即使我喜歡簡單的東西:

error_log('\\'); 

error_log("\\"); 

錯誤日誌顯示:

[Sun Oct 19 17:44:57 2014] [error] [client XXXX] \\, referer: ... 

任何想法是怎麼回事?我很擔心,因爲它看起來像這意味着mysql_real_escape_string(或PDO)不能正確地轉義字符串中的單引號,這可能導致SQL注入。每當我試着用字符串更新/插入了「在裏面,甚至稱mysql_real_escape_string後或使用引號(或bindParam用字符串),它不插入任何後」

解決:後深入挖掘它實際上正確地將事物插入到數據庫中,錯誤發生在網頁從數據庫中拉出而未處理正確的事情的另一端,所以它在html中被切斷。

+0

你在Apache中運行這個? – Austin 2014-10-19 22:57:50

+0

不,他使用error_log()將它記錄到Apache的日誌文件中。 – 2014-10-19 23:00:51

+0

您是否完成了變量的var_dump();如果是,結果如何? – jeroen 2014-10-19 23:14:33

回答

0

您需要在php.ini配置中關閉magic_quotes_gpc參數。

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

作爲一種變通方法,您可以刪除它會自動添加斜線,用stripslashes(),這樣做:

$comments = mysql_real_escape_string(stripslashes($_POST['comments']));

或本(使用PDO)

$comments = $db_pdo->quote(stripslashes($comments));

+0

magic_quotes_gpc已關閉,但我找到了解決方案。它實際上是正確地進入數據庫,但是當被傳回到網頁中的JavaScript時,它正在被切斷。 – tdes 2014-10-19 23:16:31

1

你的逃跑看起來很正常,它只有看起來有雙重轉義,因爲Apache在其日誌中轉義了反斜槓here。因此,當您在日誌中看到\\'時,它實際上只是您在PHP中使用的字符串中的\'。如果你想測試這個,echo轉義字符串,而不是使用error_log

相關問題