java web应用防止sql 注入的常规方法
继续接上一篇文章,java web 应用程序,还有另一个比较常见的攻击漏洞,也就是 sql injection. 通常也就是我们所说的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 注入的问题。