2011-09-26 25 views
0

傳遞給sql以插入表中的字符串中的引號導致存儲的proc失敗。這似乎很常見,並且PHP用戶被告知要避開引號。如果我正確理解這一點,我將不得不逃避整個文本,爲sql存儲,然後unescape它的HTML顯示。一定會有更好的辦法。我想到在調用存儲過程時設置分隔符可能是一種方法。或用PHP,重新定義報價符號。到目前爲止,我還沒有發現任何這些想法。調用存儲過程時設置分隔符

限定SP CALL分隔符

call blog.postNewBlog(delimiter // begin {$blogText} end//, 'my text1', null, null, @out_dt, @out_title, @out_text) 

回答

0

不同的分隔符仍無法從SQL注入拯救你:如果有人知道你的分隔符是什麼,他們可以操縱你的查詢,使之做壞事,只需在他們提交的任何文本中濫用分隔符字符串即可。

這種問題的正確解決方案是使用數據庫綁定,在查詢中使用佔位符。例如,在PEAR一堆數據庫抽象層,讓你的語法大致是這樣的:

$db->query("INSERT INTO table VALUES(?, ?, ?, ?)", $var1, $var2, $var3, $var4); 

關於這個偉大的事情是,抽象層將自動報價照顧(如有必要)和你根本不必關心他們。 (我相當確定這也可以用於將內容傳遞給存儲過程,但我沒有SP和MySQL的特定經驗)。

順便說一句,即使有標準種辦法,你不需要未從數據庫中獲取它們時逃避值:轉義僅用於內部查詢。引號沒有以轉義形式存儲在數據庫中,並且同樣的查詢結果也不會被轉義。