预防sql注入
Posted liangyuqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预防sql注入相关的知识,希望对你有一定的参考价值。
前言:
这两天做项目的时候发现很多小地方没有注意js或者sql注入,平时登录都是md5加密,今天突然发现记录一下。
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
过程:
类似这种很简单的页面 ,可能sql语句写法都如下:
select* form table where title =\'活动\'
但是懂点sql的人 ,可以输入\' or \'\'=\',
select* form table where title =\'\' or \'\'=\'\'
或者 \' or 1=1-- (后加一个空格)
select* form table where title =\'\' or 1=1-- \' (注释掉后面的单引号)
加上传入参数默认的两个包裹单引号,sql被解析了成了一个恒等式
于是结果如下,查询出了所有数据
升级:借助异常获取信息
破解表名:
and (select count(*) from 表名)<>0 (不等于0,判断是否正确)
破解列名:
and (select count(列名) from 表名)<>0
返回正确的,那么写的表名或列名就是正确
预防:
String sql = "select id, no from user where id=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, id); ps.executeQuery();
采用sql语句预编译和绑定变量,是防御sql注入的最佳方法
PreparedStatement,就会将sql语句:"select id, no from user where id=?" 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,
也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了
以上是关于预防sql注入的主要内容,如果未能解决你的问题,请参考以下文章