//接收参数
String user=getParam(request,"user","");
String password=getParam(request,"pswd","");
//拼装sql
String checkSql="select * from user where username='"+user+"' and password ='"+password+"'";
//请求地址
String getUrl="xxx.jsp?user=admin&password=1' or '1'='1";
获取参数合成后的sql变成了
select * from users where userid='admin' and passwd='1' or '1'='1'
这条SQL将会返回所有users数据。也许你的接口就真的把这个user数据给返回过来了。
WAF和OneRASP對SQL注入都很有效,WAF放在應用程式前面,可以透過匹配規則對SQL注入有比較好的防範,但是由於不知道SQL語句在應用程式裡面具體是如何應用的,僅根據部分參數就判斷是否是SQL注入,是不夠的。這需要管理員對應用程式足夠了解,針對應用程式做非常複雜的配置,這也造成誤殺率比較高。
而OneRASP是將保護程式像疫苗注入到應用程式中,和應用程式一起運行,它熟悉應用程式的上下文,在JDBC的statement程式裡進行保護,一方面它可以完整的看到整個SQL語句,同時它很清楚查出來的結果是什麼。這樣對於判斷是否為注入就非常有根據。也使誤殺率非常低。
OneRASP還有非常多的其他優點,有興趣的同學請上www.oneASP.com, 或是baidu一下。
預處理,將參數和查詢分開
顯然大家都知道參數化。那怎樣才能做好參數化?如果你的查詢不是複雜到非字串構造sql不可(譬如遞歸或動態層次的join),那幾乎所有情況都可以用下列方法解決:
1、SQLServer把資料跟stored procedure放在一起。其實這樣還能起到數據和封裝同步的作用,不需要兩頭改。在schema發生變化的時候,整個update都可以做transaction。
2、客戶端(或你的網站)只造訪stored procedure。
3、只給你的客戶端開啟execute權限,這樣它只能存取stored procedure。
使用stored procedure基本上就等於讓資料庫來幫你做參數化,所以你不會犯任何錯誤。而且這個方法並不會在你需要字串建構sql的時候發生問題,因為stored procedure裡面也可以建構sql,而且做這個sql建構的參數化也特別方便。
所有的注入問題都自動解決了。
我想,既然你已經了解到網站可能存在註入漏洞的危險,那麼你一定已經了解注入的原理;因此,我覺得要是你不希望自己去考慮該怎麼去過濾那些複雜精闢的注入語句的話,我覺得最好的方法是使用ORM,而不是用老一套資料庫查詢方式!如果你使用的是java寫後台的話,那麼Hibernate會是比較值得嘗試的框架!
對輸入進行轉義
使用orm框架
對sql進行過濾,可以防止
盡量不要直接用取得到的資料拼接sql進行資料庫存取
如果有用框架的話,如Struts可以自訂攔截器進行攔截
使用ORM框架
菜鳥過來答一答:舉個簡單的sql注入的方式
對SQL注入最有效的防止,就是轉義輸入。
不要相信任何使用者輸入數據,