`
gaozzsoft
  • 浏览: 413275 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

SQL注入攻击防范研究

 
阅读更多

 SQL注入攻击如何攻击的:

JDBC Statement不能避免SQL注入攻击

 

案例一-下方有个案例剖析:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";  

 

 

攻击方式:

输入username=’or 1 = 1 -- 

输入username=' ;DROP DATABASE (DB Name) --

输入username=' ;delete from user --

输入username=' ;drop table user --

 

 

SELECT * FROM user_table WHERE username=

'’or 1 = 1 -- and password='’  

 

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

 

SELECT * FROM user_table WHERE

username='' ;delete from user --' and password=''

 

SELECT * FROM user_table WHERE

username='' ;drop table user --' and password=''

 

==================================

案例二:

select * from tablename where username='"+uesrname+  

"'and password='"+password+"'"

 

攻击方式: 在用户输入'or true or'之后sql语句结构改变。

select*from tablename where username=''or true or'' and password='' //不管用户名和密码是否匹配该式的返回值永远为true;

 

PrepareStatement可以防止SQL注入 

select * from tablename where username=? and password=?  

该SQL语句会在得到用户的输入之前先用数据库进行预编译,这样的话不管用户输入什么用户名和密码的判断始终都是并的逻辑关系,防止了SQL注入

在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入 

在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击

#方式能够很大程度防止sql注入,$方式无法防止Sql注入

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics