2013-01-03 96 views
0

現在我正在使用htmlspecialchars(mysql_escape_string($value)),但有沒有一種方法可以用一個語句而不是嵌套語句來清理它?同時消毒HTML和SQL?

+4

不,沒有魔法轉義功能,您需要爲輸出到的媒體準備數據。 – jeroen

+4

[mysql_函數已被棄用](http://news.php.net/php.internals/53799)。如果可能的話使用[PDO](http://php.net/manual/en/book.pdo.php) –

+0

在旁註:sql轉義應該在html轉義之後出現,否則您可能仍然存在sql注入的風險,損壞的數據,或只是損壞的查詢。看起來不大可能,但訂單應該固定不分。 –

回答

1

mysql_real_escape_string最近實際上已經不受歡迎了。

現在優選使用PDOmysqli。他們都默認使用PHP。他們使用名爲parameterized queries的東西來訪問數據庫,而不是自己寫SQL命令。這意味着您不必擔心轉義,因爲查詢和變量分別傳遞到函數中。

您可以瞭解更多關於PDO這裏: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

與此相關的,常規的做法是把用戶輸入存儲到數據庫「因爲它被寫了」,而不是使用htmlspecialchars。然後,您應該使用htmlspecialchars轉移網站上出現的任何數據。這是由OWASP推薦的慣例。

這是因爲你需要根據上下文轉義不同的東西。此字符串:

' <script src="http://example.org/malice.js"></script> ]}\\\\-- 

...需要區別對待,如果它是JSON用作參數(引號和反斜線和]}需要進行轉義),HTML(引號和<小號需要轉義),或者寫成URL(幾乎所有的東西都需要轉義)。如果你需要花時間指導你的JavaScript去解碼HTML,那麼你的代碼會很快變得混亂。

這種做法也使得修復bug簡單:如果你的網站有地方內容是不是一個單一頁面上正確轉義的錯誤,那麼你就可以更新頁面,一切是固定的。如果您的網站存在錯誤地將數據存儲在數據庫中的錯誤,那麼您需要修復數據庫中的所有內容(這將花費更長時間並損害更多用戶)。

2

那麼沒有一個函數可以處理它們兩個。 您可以使用預先準備好的語句和html puffier類,也許那麼「外觀和感覺」會稍微好一點:)