java web应用防止sql 注入的常规方法
By:Roy.LiuLast updated:2013-10-27
继续接上一篇文章,java web 应用程序,还有另一个比较常见的攻击漏洞,也就是 sql injection. 通常也就是我们所说的SQL 注入.其实解决的方法很简单
1. 采用 orM
2. 如果是原生的SQL 语句,记得用 PreparedStatements ,参数用 ?, 代替,然后赋值。
至于ORM ,无论是 HIBERNATE, 还是IBATIS,mybatis, 都具备防止SQL 注入的功能, 因为在框架的内容已经考虑到这些东西,所以如果用ORM 一般不会出现SQL 注入的攻击,但是也要小心,所有的东西都不是绝对的,与使用的人相关。
如果采用native sql的话,那么必须使用 PreparedStatements , 来杜绝SQL 注入。比如:
这段代码,本身不会有问题,但如果 type 参数是从request 中获取到的,比如为 WidgetB'";drop .....那么这时候,就产生很严重的后果,推荐用如下方式:
用 ? 占位符,无论是参数是常量,还是从 request .中获得的,都不会产生SQL 注入的问题。
1. 采用 orM
2. 如果是原生的SQL 语句,记得用 PreparedStatements ,参数用 ?, 代替,然后赋值。
至于ORM ,无论是 HIBERNATE, 还是IBATIS,mybatis, 都具备防止SQL 注入的功能, 因为在框架的内容已经考虑到这些东西,所以如果用ORM 一般不会出现SQL 注入的攻击,但是也要小心,所有的东西都不是绝对的,与使用的人相关。
如果采用native sql的话,那么必须使用 PreparedStatements , 来杜绝SQL 注入。比如:
Statement statement = con.createStatement(); statement.executeQuery("Select name FROM widgets Where type = 'WidgetB'");
这段代码,本身不会有问题,但如果 type 参数是从request 中获取到的,比如为 WidgetB'";drop .....那么这时候,就产生很严重的后果,推荐用如下方式:
final String widgetType = "WidgetB"; Statement pStatement = con.prepareStatement("Select name FROM widgets Where type = ?"); pStatement.setString(1,widgetType); pStatement.executeQuery();
用 ? 占位符,无论是参数是常量,还是从 request .中获得的,都不会产生SQL 注入的问题。
From:一号门
Previous:java 防止 XSS 攻击的常用方法总结.
COMMENTS