2011-01-08 113 views
9

我對PHP很陌生,基本上我正在爲我的網站創建一個評論系統。我有以下功能:htmlentities()和mysql_real_escape_string()是否足以清除PHP中的用戶輸入?

$ input = $ _POST ['comment'];

function cleanUserInput($ input){ $ input = mysql_real_escape_string($ input); $ input = htmlentities($ input); return $ input; }

所以問題是,mysql_real_escape_string單獨足以防止SQL注入?並且htmlentities()足以防止用戶輸入的腳本,html和樣式具有實際效果並僅顯示爲文本?

還是我需要添加更多的功能,使輸入真正無害?

+0

對於逸出HTML中,使用用htmlspecialchars()代替。 – 2011-01-08 06:22:20

回答

2

這兩個功能解決了有關注入任何類型和一些更多問題的安全問題的主要部分,但是,應用程序可以有安全錯誤的數量是驚人的。

如果你是一個安全怪胎,那麼你遇到的主要問題,但你會開始檢查Chris Shiftlett's website,誰是全球PHP安全的主要權威之一。

最後,你可以檢查OWASP web,他們Top Ten Project,在那裏他們保持對最常見的安全威脅跟蹤和不斷更新的硬件與他們戰鬥,

希望我能有所幫助。

11

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,它是爲你完成的。

至於這種類型的安全性而言,我建議使用下列內容:

  1. 下載和安裝damn vulnerable web app。它的一個應用程序,旨在傳授黑客攻擊的插件和網頁的情況(基於PHP)
  2. 總是試圖提出不同的字符集的字符
  3. 總是嘗試提交空字節
  4. 避免傳入參數太多查詢字符串(它可以放棄你的數據結構)
  5. 看你的日誌
  6. 下載burpsuite - 你永遠不會看到一個網站,以同樣的方式再次
  7. 手錶而健談。 mysql錯誤信息非常適合調試,但是它們會泄露大量信息 - 通常會顯示整個查詢!

底線 - 如果來自用戶,那麼不能被信任!

+0

謝謝您的反對評論! :) – sethvargo 2014-12-03 20:14:52

1

如果您使用的是PHP 5.2或更新的版本,則可以使用內置的輸入消毒功能。

例如:

$input = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);

參考文獻:

  1. filter_input
  2. Available filters
相關問題