2011-02-06 13 views
1

如何防止sql注入在php中,但仍顯示「和」?一個我使用如何防止sql注入但保留「和」?

$input = strip_tags($input); 
$input = htmlentities($input); 

但是輸出\當下」和\」。反正我有可以顯示「和」沒有斜線,但保留他們那裏,所以我沒有得到注入?

+0

在執行數據庫命令之前用''(兩次單引號)替換' – 2011-02-06 15:38:10

回答

1

首先,該代碼不是反斜槓,當然它們仍然存在。使用stripslashes()去掉反斜槓,但不要這樣做。 如果你在數據庫中看到了這些斜槓,並且你已經使用了mysql_real_escape_string,那麼你可能已經開啓了magic_quotes_gpc,並且你正在添加另一組slahses。首先刪除那些自動添加的,然後應用mysql_real_escape_string,它們不會以這種方式顯示,但仍然會在那裏,並在查詢您的數據庫時安全使用。

5

告訴你的方法是不是防止SQL注入之有道!

請始終使用您正在使用的數據庫庫提供的衛生方法,例如mysql_real_escape_string()如果你使用標準的mysql庫。衛生方法不會改變最終結果中的任何字符。

或者,使用PDO或mysqli中的準備語句 - 如果您正確綁定傳入數據,那麼會自動輸入衛生設施。

+0

好吧,謝謝,我會試試。我只需要在mysql中插入/刪除東西時執行此操作? – Yesterday 2011-02-06 15:39:16

+1

@Cameron是的,衛生方法是特定於mysql的。您還需要做其他事情,例如在HTML頁面中輸出數據或將它們作爲電子郵件發送時,但該特定事項僅適用於MySQL。 – 2011-02-06 15:40:28

+0

因此,如果我想在我將它們放入我的數據庫之前回顯這些內容,可以忽略mysql_real_escape_string直到我插入數據?它顯示\\''現在和\\'「由於某種原因! – Yesterday 2011-02-06 15:42:02

0

對於不小心,沒有什麼神奇的解決方案。

單獨的這些斜槓不防止SQL注入。它們的存在表明了另一個問題,magic_quotes。魔術引號是PHP2中的一個便利功能,從來沒有作爲安全功能。 (順便說一下,當數據庫不支持多字節字符時,他們在1997年左右就安全了)。

無論如何,禁用magic_quotes。使用手動轉義(mysql_real_escape_string)或者更好的方式使用PDO更方便的準備語句。

如果你想懶惰,仍然禁用magic_quotes。但是使用$_GET = array_map("mysql_real_escape_string", $_GET);並且在腳本開始和數據庫連接建立之後對$ _POST和$ _REQUEST執行相同的操作。
然後將htmlentities(stripslashes($input))用於寫入輸出以除去多餘的反斜槓。