我只是想知道,如果我不止一次地使用mysql_real_escape數據,它是否會有所作爲?mysql_real_escape不止一次
所以,如果我在我的網站的一部分,然後再在另一部分代碼中的數據溢出。這會成爲一個問題嗎?或者有所作爲?
我只是想知道,如果我不止一次地使用mysql_real_escape數據,它是否會有所作爲?mysql_real_escape不止一次
所以,如果我在我的網站的一部分,然後再在另一部分代碼中的數據溢出。這會成爲一個問題嗎?或者有所作爲?
是的。你會得到額外的不必要的反斜槓。
不可能區分轉義字符串和非轉義字符串,因爲看起來像轉義字符串的東西是預期的非轉義字符串。因此,試圖再次逃跑,將逃避逃跑 - 而逃脫的文本將成爲MySQL讀取的內容。
因此,你不應該多次逃脫。
但是,更好的解決方案是使用參數化查詢,因爲那樣你根本不需要轉義。
是的,這將是一個問題。
例如:
如果一個是「喬的家」,第一個電話會產生「喬\之家」,第二個會產生「喬\\\之家」,節約反斜槓在數據庫中。
這與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編輯的答案,以反映在下面的評論更正]
魔術引號與mysql(i)_(real)_escape字符串不會執行相同的轉義。如果您無法禁用魔術引號,正確的方法是使用反斜槓將其除去,然後在必要時應用轉義(即,如果您不能使用參數化查詢)。理想情況下,您可以在一開始就擺脫魔術引號,以避免每次需要在非數據庫環境中輸出魔術引號。 – 2010-05-16 13:16:34
因爲你的分數,我不會低調,但這種做法是錯誤的。轉義應該只是'$ value = mysql_real_escape_string($ _ GET [「value」]); ** **無條件**。擺脫魔術引語是另一件應該在查詢撰寫之前完成的事情,在腳本的最頂端。 – 2010-05-16 13:17:21
如果在最後一個條件中沒有執行'$ value = mysql_real_escape_string(stripslashes($ _ GET [「value」]));那麼我將不得不倒退。 – 2010-05-16 13:17:23
是的,這將是一個過擒縱問題。任何逃跑都是一樣的,不管它究竟是什麼。舉例來說,如果你想逃避字符串雙引號以下共同的規則:一個轉義成爲
bla \"foo\"
bla "foo"
經過兩次成爲
bla \\\"foo\\\"
等之後。 「unescapements」的數量必須與「擒縱系統」的數量完全匹配。您可以在某些網站上看到此問題的表現形式,這些網站超出了文本字段中的某些字符,因此輸出時簡單的撇號變爲\'
。
是的,它的確與衆不同:
$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!
正確的地方mysql_real_escape是您發送的查詢保存數據之前。 腳本中的其他任何地方都是主要的設計缺陷。
這當然應該最好在一個自己的db級中。
有史以來最偉大的一點!我應該自己記下它。 – 2010-05-16 13:28:59
這是正確的地方,但不是解決問題的最佳方式。 – 2010-05-16 13:42:37
@Blair小心解釋一下?什麼問題和什麼是最好的? – 2010-05-16 13:47:07
爲什麼不試試它並將結果打印出來? – 2010-05-16 13:13:23
'mysql_real_escape_string'不是冪等函數。 – Gumbo 2010-05-16 13:32:23