加入收藏 | 设为首页 | 会员中心 | 我要投稿 柳州站长网 (https://www.0772zz.cn/)- 基础存储、数据迁移、云安全、数据计算、数据湖!
当前位置: 首页 > 站长资讯 > 动态 > 正文

如何干掉恶心的SQL注入?

发布时间:2021-03-02 15:22:21 所属栏目:动态 来源:互联网
导读:2、是 Java 访问数据库的 API,不依赖于特定数据库 ( database-independent ) 3、所有 Java 持久层技术都基于 JDBC 说明 直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入,如 还有一些情况,比如 order by、column name,不能使

2、是 Java 访问数据库的 API,不依赖于特定数据库 ( database-independent )

3、所有 Java 持久层技术都基于 JDBC

说明

直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入,如
 

还有一些情况,比如 order by、column name,不能使用参数绑定,此时需要手工过滤,如通常 order by 的字段名是有限的,因此可以使用白名单的方式来限制参数值

这里需要注意的是,使用了 PreparedStatement 并不意味着不会产生注入,如果在使用 PreparedStatement 之前,存在拼接 sql 语句,那么仍然会导致注入,如
 

正常情况下,用户的输入是作为参数值的,而在 SQL 注入中,用户的输入是作为 SQL 指令的一部分,会被数据库进行编译/解释执行。当使用了 PreparedStatement,带占位符 ( ? ) 的 sql 语句只会被编译一次,之后执行只是将占位符替换为用户输入,并不会再次编译/解释,因此从根本上防止了 SQL 注入问题。

更详细和准确的回答,请参考:
 

可以看到,使用者需要自己编写 SQL 语句,因此当使用不当时,会导致注入问题

与使用 JDBC 不同的是,MyBatis 使用 #{} 和 ${} 来进行参数值替换

使用 #{} 语法时,MyBatis 会自动生成 PreparedStatement ,使用参数绑定 ( ?) 的方式来设置值,上述两个例子等价的 JDBC 查询代码如下:

(编辑:柳州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读