2013-06-18 31 views
2

我讓用戶輸入一些信息(姓名,出生日期等)。然後我必須將這些值插入數據庫。我是否應該使用mysql_real_escape_string()來防止mysql注入和htmlspecialchars()來處理html標記,他們都需要或者他們中的一個會這樣做嗎?我應該使用htmlspecialchars或mysql_real_escape_string或兩者

如果我只使用其中的一個,那麼哪一個? 如果我應該使用兩者,那麼哪一個是第一個,哪個是最後一個?

+1

您混爲一談輸入編碼和輸出編碼 - 總之,'mysql_real_escape_string()'=編碼數據進入數據庫(其ISN作爲當前的「最佳實踐」,使用參數化查詢是不必要的),並且當向用戶顯示內容時輸出「htmlspecialchars()」編碼。輸出編碼絕對是必需的。我建議各種OWASP作弊表/資源作爲進一步閱讀。 – kwah

回答

3

我應該使用mysql_real_escape_string防止MySQL的注入

Use prepared statements and parameterized queries。這將要求您停止使用陳舊的mysql_*庫,以支持更現代的內容(如PDO)。

和htmlspecialchars處理html標籤兩者或其中之一可以做的工作?

使用htmlspecialcharsprotect against XSS attacks when您將數據插入HTML文檔。數據庫不是HTML文檔。 (您可能稍後將數據從數據庫中取出以將其放入HTML文檔中,這是使用htmlspecialchars的時間)。

0

mysql_real_escape_string()!您應該使用PDO。它使用準備好的語句,因爲MySQL給出unparameterized SQL,然後再給出的數據中插入該不會是容易受到注入攻擊

例如:

$dbh = new PDO(); 
$stmt = $dbh->prepare('INSERT INTO data (something) VALUE(:userInput)'); 

// No mysql_real_escape_string necessary 
$stmt->execute(array(
    ':userInput' => $_POST['userInput'] 
)); 

htmlspecialchars()不宜使用對所有的輸入,但它應該使用!雖然通常在從數據庫中檢索數據之後應用(儘管之前執行它可能是一個好主意(以防萬一以後被遺忘),但對於用戶輸入來說,您將回顯到HTML頁面中,這很有用。它可以保護您免受XSS(跨站點腳本攻擊)攻擊,其中惡意用戶可以將包含惡意代碼的<script>標記添加到網站的輸入字段中。當其他用戶訪問此惡意用戶發佈的頁面時,他們的瀏覽器將解釋惡意腳本,這可能會執行諸如竊取會話ID或嘗試CSRF(跨站點請求僞造)等操作。

底線:您應該在將任何用戶內容回顯到您的頁面之前使用它。除非該內容已經通過嚴格的篩選器驗證(例如只適用於年/月/日的生日)。如果您不確定,請反正使用它。它不會受傷。它只會幫助!

進一步閱讀:

相關問題