一:JDBC拼接不当造成的SQL注入
执行sql注入的两种方法
- PrepareStatement和Statement
- 区别
- PrepareStatement会对SQL语句进行预编译
- Statement方法在每次执行时都需要编译,会增大系统开销。
- Statement
- 该方法使用了拼接的方式,将用户的输入“id”带入SQL语句中,通过创建的Statement对象进行执行但是由于是用的拼接的方式,因此输入1 or 2 = 3就会拼接执行语句,产生SQL注入漏洞
- PrepareStatement
- 支持预编译也就是在预编译阶段通过“?”作为占位符,先执行了一遍SQL语句,参数用 占位符代替,目的是为了检查语法是否正确。后续用户输入的字符将被用来代替占位符“?”,但是所有的变量都将被视为字符串,不会拼接关键字或是恶意语法等进入注入语句。
- 错误使用preparestatement
- 虽说PrepareStatement支持预编译,但是上述代码使用了PrepareStatement却未使用预编译的形式,采用了同Statement的拼接形式,因此输入1 or 2 = 3同样会拼接执行语句,产生注入漏洞。
- 正确使用preparestatement
- 区别
二:框架使用不当造成的SQL注入
mybatis框架
- MyBatis中使用parameterType向SQL语句传参,在SQL引用传参可以使用#{Parameter}和${Parameter}两种方式
- #{}
- 使用了预编译的格式,因此不存在注入漏洞
- ${}
- 使用的是拼接的格式,因此会存在注入漏洞
- like注入
- in注入
- order by注入
- 使用的是拼接的格式,因此会存在注入漏洞
- #{}
Hibenate框架
- 暂时忽略