2010-05-16 64 views
-2

我只是想知道,如果我不止一次地使用mysql_real_escape數據,它是否會有所作爲?mysql_real_escape不止一次

所以,如果我在我的網站的一部分,然後再在另一部分代碼中的數據溢出。這會成爲一個問題嗎?或者有所作爲?

+9

爲什麼不試試它並將結果打印出來? – 2010-05-16 13:13:23

+0

'mysql_real_escape_string'不是冪等函數。 – Gumbo 2010-05-16 13:32:23

回答

3

是的。你會得到額外的不必要的反斜槓。

1

當然,數據會被雙重轉義。

根本不應該使用mysql_real_escape(),通過mysqli的參數化查詢一直存在很長時間。

+0

@誰低估了這一點:解釋本來不錯。 – Tomalak 2010-05-16 15:09:39

1

不可能區分轉義字符串和非轉義字符串,因爲看起來像轉義字符串的東西是預期的非轉義字符串。因此,試圖再次逃跑,將逃避逃跑 - 而逃脫的文本將成爲MySQL讀取的內容。

因此,你不應該多次逃脫。

但是,更好的解決方案是使用參數化查詢,因爲那樣你根本不需要轉義。

2

是的,這將是一個問題。

例如:
如果一個是「喬的家」,第一個電話會產生「喬\之家」,第二個會產生「喬\\\之家」,節約反斜槓在數據庫中。

這與Web服務器啓用魔術引號時出現的問題類似,並且您在客戶端的輸入上使用了mysql_real_escape_string。這是通過解決:

if (! get_magic_quotes_gpc()) { 
    $value = mysql_real_escape_string($_GET["value"]); 
} else { 
    $value = mysql_real_escape_string(stripslashes($_GET["value"])); 
} 

(對於後者例如參見http://www.php.net/get_magic_quotes_gpc

[I編輯的答案,以反映在下面的評論更正]

+0

魔術引號與mysql(i)_(real)_escape字符串不會執行相同的轉義。如果您無法禁用魔術引號,正確的方法是使用反斜槓將其除去,然後在必要時應用轉義(即,如果您不能使用參數化查詢)。理想情況下,您可以在一開始就擺脫魔術引號,以避免每次需要在非數據庫環境中輸出魔術引號。 – 2010-05-16 13:16:34

+0

因爲你的分數,我不會低調,但這種做法是錯誤的。轉義應該只是'$ value = mysql_real_escape_string($ _ GET [「value」]); ** **無條件**。擺脫魔術引語是另一件應該在查詢撰寫之前完成的事情,在腳本的最頂端。 – 2010-05-16 13:17:21

+0

如果在最後一個條件中沒有執行'$ value = mysql_real_escape_string(stripslashes($ _ GET [「value」]));那麼我將不得不倒退。 – 2010-05-16 13:17:23

1

是的,這將是一個過擒縱問題。任何逃跑都是一樣的,不管它究竟是什麼。舉例來說,如果你想逃避字符串雙引號以下共同的規則:一個轉義成爲

bla \"foo\" 

bla "foo" 

經過兩次成爲

bla \\\"foo\\\" 

等之後。 「unes​​capements」的數量必須與「擒縱系統」的數量完全匹配。您可以在某些網站上看到此問題的表現形式,這些網站超出了文本字段中的某些字符,因此輸出時簡單的撇號變爲\'

0

是的,它的確與衆不同:

$string = "I'm Chuck!"; 
mysql_escape_string($string); // I\'m Chuck! 
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck! 
8

正確的地方mysql_real_escape是您發送的查詢保存數據之前。 腳本中的其他任何地方都是主要的設計缺陷。

這當然應該最好在一個自己的db級中。

+0

有史以來最偉大的一點!我應該自己記下它。 – 2010-05-16 13:28:59

+0

這是正確的地方,但不是解決問題的最佳方式。 – 2010-05-16 13:42:37

+0

@Blair小心解釋一下?什麼問題和什麼是最好的? – 2010-05-16 13:47:07