如何防止SQL注入


什么是SQL注入?

 SQL Injection 就是利用
某些數據庫的外部接口將用戶數據插入到實際的數據庫操作語言(SQL)當中,從而達到入
侵數據庫乃至操作系統的目的。它的產生主要是由於程序對用戶輸入的數據沒有進行嚴格的
過濾,導致非法數據庫查詢語句的執行 。

SQL注入的危害

  SQL 注入(SQL Injection)攻擊具有很大的危害,攻擊者可以利用它讀取、修改或者
刪除數據庫內的數據,獲取數據庫中的用戶名和密碼等敏感信息,甚至可以獲得數據庫管理
員的權限,而且,SQL Injection 也很難防范。網站管理員無法通過安裝系統補丁或者進行簡
單的安全配置進行自我保護,一般的防火牆也無法攔截 SQL Injection 攻擊

防止SQL注入方法
  1、JavaJSP 開發的應用,可以使用 PrepareStatement+Bind-variable 來防止 SQL 注入

String sql = "select * from users u where u.id = ? and u.password = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,pwd);

resultset rs = ps.executequery();

  2、使用應用程序提供的轉換函數

  很多應用程序接口都提供了對特殊字符進行轉換的函數,恰當地使用這些函數,可以
防止應用程序用戶輸入使應用程序生成不期望的語句。
   MySQL C API:使用 mysql_real_escape_string() API 調用。
   MySQL++:使用 escape quote 修飾符。
   Perl DBI:使用 placeholders 或者 quote()方法。
  Ruby DBI:使用 placeholders 或者 quote()方法

  3、自己定義函數進行校驗
  整理數據使之變得有效;
  拒絕已知的非法輸入;
  只接受已知的合法輸入。
  所以如果想要獲得最好的安全狀態,目前最好的解決辦法就是對用戶提交或者可能改
變的數據進行簡單分類,分別應用正則表達式來對用戶提供的輸入數據進行嚴格的檢測和驗
證。
  下面采用正則表達式的方法提供一個驗證函數,以供大家參考。
已知非法符號有:

“’”“;”“=”“(”“)”“/*”“*/”“%”“+”“”“>”“<”“--”“[”“]”
其實只需要過濾非法的符號組合就可以阻止已知形式的攻擊,並且如果發現更新的攻
擊符號組合,也可以將這些符號組合增添進來,繼續防范新的攻擊。特別是空格符號和與其
產生相同作用的分隔關鍵字的符號,例如“/**/”,如果能成功過濾這種符號,那么有很多
注入攻擊將不能發生,並且同時也要過濾它們的十六進制表示“%XX”。
由此可以構造如下正則表達式:
(|\'|(\%27)|\;|(\%3b)|\=|(\%3d)|\(|(\%28)|\)|(\%29)|(\/*)|(\%2f%2a)|(\*/)|(\%2a%2f)|\+| (\
%2b)|\<|(\%3c)|\>|(\%3e)|\(--))|\[|\%5b|\]|\%5d)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM