SQL注入防御技术之Java预编译
本文作者:无名安全团队-w蛇皮怪怪w
学完基础的sql注入以及相关绕过。对比之前听说过的 java预防注入的预编译,尝试分析预编译的原理以及如果绕过的可能性。
SQL注入概念
通过控制前端的可控变量,向后端数据库传递恶意语句,达到查看后端数据库中信息。包括但不限制于管理员登录密码、普通用户登录密码、网站用户登录密码等。
SQL注入必要条件
1)网页存在可控参数
post、get、cookie等
2)传入参数可以拼接到sql语句
3)sql语句能够正确执行
4)根据网页能够判断传入的SQL语句是否正确执行
直接显示数据库内容、网页正确或错误显示、网页响应延时、错误sql产生的报错等
java预编译预防注入
预编译原理
1)将sql语句通过prepareStatement方法进行预处理,并将处理结果存储
2)设置该sql语句所需的参数类型
3)接受参数时,判断该参数是否存在于定义的类型范围内,如果与定义类型不同,将编译不通过,并且不会插入到数据库执行
预编译代码
String sql = "select * from table where id = ?";
Connection con = .....///数据库连接
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1,id);//设置对应的参数的类型
产生的疑问
如果指定的参数类型是字符串的话,那么是否存在绕过的可能?
首先预处理是用 “?” 来当做标志符,杜绝了用 “+” 来链接恶意sql语句操作的余地。
PreparedStatement所具有的功能是将前端传来的参数做到 真正的参数化 ,以传参的形式传递给处理函数,进行验证类型,以及相关权限约束。由于sql语句格式
是已经规定好的,用户只能提供数据,还必须是sql所需数据内容,缺的只是具体的那几个数据,用户无法用可控参数作出越界操作,也就达到恶意代码无效化 。
由此来看,在java预编译的防护下,产生注入的可能性很低。
并且一个网站还有可能人为的过滤,以及web相关的防护应用。
或者PreparedStatement接口方法中,本身就存在对sql关键字的过滤等操作。(个人猜测,毕竟该接口就是为了防范sql注入)
以上仅为学习参考,具体需要读者自行甄别。