SQL注入及解决

SQL注入示例:

JAVA代码:

String sql = "select * from product where pname like '%'"
			+ request.getParameter("pname") + "'%'";
conn.execqueryResultSet(sql); 

构造SQL注入攻击代码

http://test.qunar.com/product.jsp?id=1' and 1= 2 
uoion select 1, name, pass, 4 from user where "<>'

插入攻击代码之后的SQL语句

select * from product where pname like '%1' and 1= 2 
uoion select 1, name, pass, 4 from user where "<>'

解决:

1)MyBatis使用时,SQL参数时统一使用#{},禁止使用${}

2)数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。

3)确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。

4)SQL注入需要输入‘ 和空格等字符,对进入数据库的特殊字符(’"<>&*;等)进行转义处理,或编码转换。

5)严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

6)网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。

7)使用PreparedStatement防止SQL注入
如果有一条SQL语句: “select * from 表 where 用户名 = ‘用户名’”
Statement的SQL语句是这样写的:
“select * from 表 where 用户名 = '”+ 变量值 +"’"
PreparedStatement的SQL语句是这样写的:
“select * from 表 where 用户名 = ?” 然后对应?赋值
输入 “aa’ or ‘1’ = '1”
Statement是将这个和SQL语句做字符串连接到一起执行,和最上边一样的形式。
PreparedStatement是将 “aa’ or ‘1’ = '1” 作为一个字符串赋值给?,做为"用户名"字段的对应值,显然这样SQL注入无从谈起了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TriumPhSK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值