2012-04-12 67 views
2

我正在使用PDO給用戶輸入,但現在我沒有使用PDO顯示來自我的MySQL數據庫的內容(仍然是使用SQL命令的舊式方式..)。使用PHP PDO時,我應該清理/過濾用戶輸入和輸出嗎?

將數據插入到MySQL數據庫時,是否有必要過濾/清理用戶的輸入?

而且,如果要走的路是消毒輸出,那麼消毒輸出的最佳方式是什麼?我很好走,如果我只使用htmlspecialchars()或我需要使用strip_tags()和其他東西嗎?

我正在使用佔位符和準備語句。

謝謝。

回答

6

你在這裏混淆不同的消毒:

  • 的SQL sanatizing數據插入到你的數據庫。通過使用params準備查詢,不需要轉義,PDO可以在內部執行。如果您不使用準備好的查詢,請使用它們。它是防彈的(據我所知)。

  • 您從DB和輸出HTML中得到的數據:在這裏你有它打印到用戶之前,sanatize(防止XSS),無論是使用htmlspecialchars()htmlentites()strip_tags(),這取決於你想要什麼逃避或刪除。

+0

如果我想逃跑的字符串,其100%安全 – 2by 2012-04-12 18:31:59

+1

你會與每個函數安全,但使用一個你需要的:'strip_tags'除去HTML代碼,而不是'htmlspecialchars'至極只能協商他們(所以他們仍然會被展示,但不被瀏覽器解釋)。 'htmlentities'也會編碼像àéè這樣的字符。如果您的應用程序支持UTF-8,只需使用'htmlspecialchars'。 請參閱http://stackoverflow.com/questions/7232793/should-i-use-both-striptags-and-htmlspecialchars-to-prevent-xss – Claaker 2012-04-12 18:37:14

+0

使用htmlentities()而不是htmlspecialchars()。 – 2012-04-12 18:43:47

5

如果您正確使用參數化查詢,那麼不需要轉義。那實際上將轉義的數據插入到數據庫中,所以當你選擇數據時你會得到逃脫回來。

但是,只是切換到PDO,不是使您的代碼更安全,例如,如果你這樣做

$sth = $db->prepare("INSERT INTO sometable (x) VALUES ($_GET[x])"); 

仍然完全容易受到注入攻擊,因爲你沒有使用佔位符。

+0

我正在使用佔位符和準備語句。 – 2by 2012-04-12 18:30:57