我不覺得有資格完全回答您的問題,所以請謹慎使用我提供的信息,但我在管理您可能正在查看的這些更改方面有一些經驗。然而,如果你所說的話是真實的,那麼你的語句應該可以保護你免受XSS和SQL注入攻擊。
我最近已經開始了將整個大型應用程序從mysql_遷移到mysqli_的過程,並且在此過程中我還設定了所有用戶輸入應通過預準備語句的目標。
爲了迴應下面的YC公平評論進行編輯:爲了避免歧義,我總是把用戶通過準備好的語句生成的任何東西,即使它已經存儲在數據庫中。儘可能避免使用重新插入用戶數據,因爲它是不可靠的,所以系統函數往往依賴於自動生成的索引。
公平地說,頁面很短(不超過1000行),所以修復不會每頁花費很長時間,而且他們的查詢也很少,所以性能下降並不明顯,而且肯定會因服務器技術的改進而吃光了,因爲我寫了原來的代碼。我懷疑你會發現,儘管你必須檢查它是否危急,但是逃避等等的減少遠遠超過了對準備語句的任何性能影響。
令我感到沮喪的是,在執行此評論時,我在代碼中發現了多少個漏洞(我在寫入時包含安全性儘可能最好,並且自己的規則與您的規則大致相同),最終我發現需要重寫大代碼塊以提高安全性。由於更豐富的經驗和代碼調整,性能得到顯着改善。
我正在進行的改變的方式是添加一個mysqli連接到我的數據庫頭文件。所有新代碼都使用這個。當我發現時,我正在更新舊代碼並使用沒有舊的mysql連接的頭文件測試每個頁面。在開發環境中很快找到你錯過的部分,這可能是一種非常好的方式,因爲每個頁面只需要幾分鐘更新就可以浪費時間,因此可以在腦衰落期間完成周期。
第二順序噴射順便說一句,因爲這是我所建在最常見的漏洞的說明:
大多數SQL注入預防樣的假設注入攻擊只會發生在登錄時,從一個惡意的非曾經挫敗的註冊用戶永遠不會返回,並且註冊用戶可以被信任。並非如此。
可以想象,代碼可以通過您的保護注入,然後使用。由於它嚴重依賴於笨拙的數據庫和應用程序設計,因此這種方法最不可能奏效,但世界上一些最聰明的人是黑客。爲什麼讓他們的生活更輕鬆
如果你的sql很簡單,並且你的應用程序使用之前從數據庫中獲得的數據執行任何subquerying,那麼攻擊就會變得更加可能。請記住,
' OR 1=1 gets converted to
\' OR 1=1 by mysql_real_escape_string but is stored as
' OR 1=1 in the db
所以如果檢索並放置到一個PHP變量,然後在SQL查詢中使用轉義,它就可以引起問題一樣的,就好像它從來沒有逃脫。如果您僅對所有查詢使用準備語句,則風險會永久消失,但請記住準備語句仍會存儲惡意代碼,因此當您下次需要使用已輸入的數據時,您仍然必須再次使用準備好的語句。
This Blog給出了一個體面的討論和示例,所以我不會進一步擴展,但如果確保所有用戶輸入數據都通過準備好的語句,如果它被用作查詢的一部分,即使它已經存儲在數據庫中,你應該是安全的。
在重複的風險下,它也值得對OWASP site非常友好,它具有重要的安全性討論。
如果你看看['mysql_real_escape_string()']頁面(http://php.net/mysql_real_escape_string),有一個黃色的橫幅表示你需要設置字符集(直接在服務器上或者通過使用[ mysql_set_charset()'](http://www.php.net/manual/en/function.mysql-set-charset.php))以使mysql_real_escape_string生效。 – MarcDefiant 2013-03-18 09:21:45
我建議把這個問題分成2個單獨的問題。已棄用的mysql模塊與XSS(以及XSRF和其他幾十種)的攻擊完全無關。 – 2013-03-18 09:36:28
@Mogria請加你的評論作爲一個完整的答案,所以我可以表決它:) – 2013-03-22 12:58:01