mysql_real_escape_string是不夠的。您還必須考慮如何構建您的查詢。考慮下面這個簡單的登錄腳本:
$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$sql = "SELECT * FROM users WHERE username = $username AND password = $password";
沒有引號$username
和$password
,注入仍然是可能的。 (考慮一個用戶名=測試; DROP TABLE用戶; - 再見數據:(
mysql_real_escape_string是從消毒點足夠如果你正確地組織你的查詢正確構造的查詢,這工作正常
!。
一個更好的問題是「你想要防止什麼?」你還應該知道存儲和反映的XSS(跨站點腳本)。如果你將用戶的輸入存儲在數據庫中,並且數據在瀏覽器,您至少需要去掉<script>
標籤
根據您的語言,有很多過濾器和代碼可供在線使用如果您使用Rails或Cod eIgniter,它是爲你完成的。
至於這種類型的安全性而言,我建議使用下列內容:
- 下載和安裝damn vulnerable web app。它的一個應用程序,旨在傳授黑客攻擊的插件和網頁的情況(基於PHP)
- 總是試圖提出不同的字符集的字符
- 總是嘗試提交空字節
- 避免傳入參數太多查詢字符串(它可以放棄你的數據結構)
- 看你的日誌
- 下載burpsuite - 你永遠不會看到一個網站,以同樣的方式再次
- 手錶而健談。 mysql錯誤信息非常適合調試,但是它們會泄露大量信息 - 通常會顯示整個查詢!
底線 - 如果來自用戶,那麼不能被信任!
對於逸出HTML中,使用用htmlspecialchars()代替。 – 2011-01-08 06:22:20