Java 如何防止 SQL 注入?
很多语言已经帮我们做好了对应的 API。比如 Java 我们用 PreparedStatement
String sql= "select * from users where username=? and password=?;
PreparedStatement preState = conn.prepareStatement(sql);
preState.setString(1, userName);
preState.setString(2, password);
ResultSet rs = preState.executeQuery();
PreparedStatement 防止 sql 注入的原理,会将参数中的单引号转义
String sql = "select * from goods where min_name = ?"; // 含有参数
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "儿童'"); // 参数赋值
System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@d704f0: select * from goods where min_name = '儿童\''
上面的 sql 在执行的时候将会报错,从而防止了 sql 注入。
上面的是 String 参数防止 sql 注入的方式,对于整数类型,PreparedStatement 提供了 setInt setLong 的方式。
或者,我们可以用正则,把 有 单引号 '
,分号 ;
和 注释符号 –
的语句给替换掉来防止 SQL 注入
return str.replaceAll(".*([';]+|(--)+).*", " ");
PreparedStatement 百分之百的防止 SQL 注入吗?不是的对于用户输入的 %
,PreparedStatement 是不会做转义处理,在模糊查询时将对数据有影响。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Web 容器有几种作用域?
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论