Java 如何防止 SQL 注入?

发布于 2025-01-11 12:46:27 字数 1147 浏览 5 评论 0

很多语言已经帮我们做好了对应的 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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
25 人气
更多

推荐作者

陈独秀

文章 0 评论 0

最后的乘客

文章 0 评论 0

Jerry111

文章 0 评论 0

守护在此方

文章 0 评论 0

相思碎

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文