这两天作项目的时候发现不少小地方没有注意js或者sql注入,平时登陆都是md5加密,今天忽然发现记录一下。正则表达式
所谓SQL注入,就是经过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。sql
相似这种很简单的页面 ,可能sql语句写法都以下:数据库
select* form table where title ='活动' 服务器
可是懂点sql的人 ,能够输入' or ''=',工具
select* form table where title ='' or ''='' 加密
或者 ' or 1=1-- (后加一个空格)spa
select* form table where title ='' or 1=1-- ' (注释掉后面的单引号)code
加上传入参数默认的两个包裹单引号,sql被解析了成了一个恒等式orm
因而结果以下,查询出了全部数据blog
破解表名:
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语句的 语法结构了