什么是SQL注入?
SQL Injection 就是利用
某些數據庫的外部接口將用戶數據插入到實際的數據庫操作語言(SQL)當中,從而達到入
侵數據庫乃至操作系統的目的。它的產生主要是由於程序對用戶輸入的數據沒有進行嚴格的
過濾,導致非法數據庫查詢語句的執行 。
SQL注入的危害
SQL 注入(SQL Injection)攻擊具有很大的危害,攻擊者可以利用它讀取、修改或者
刪除數據庫內的數據,獲取數據庫中的用戶名和密碼等敏感信息,甚至可以獲得數據庫管理
員的權限,而且,SQL Injection 也很難防范。網站管理員無法通過安裝系統補丁或者進行簡
單的安全配置進行自我保護,一般的防火牆也無法攔截 SQL Injection 攻擊
防止SQL注入方法
1、對 Java、JSP 開發的應用,可以使用 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)