Java项目防止SQL注入的四种方案
00 分钟
2023-8-3
2023-10-19
type
status
date
slug
summary
tags
category
icon
password
URL
notion image
  • 一、什么是SQL注入?
  • 二、Java项目防止SQL注入方式
    • 1、PreparedStatement防止SQL注入
    • 2、mybatis中#{}防止SQL注入
    • 3、对请求参数的敏感词汇进行过滤
    • 4、nginx反向代理防止SQL注入

一、什么是SQL注入?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL案列
这个id从请求参数中获取,若参数被拼接为:
1001 or 1 = 1
最执行语句变为:
此时,数据库的数据都会被清空掉,后果非常严重

二、Java项目防止SQL注入方式

这里总结4种:
  • PreparedStatement防止SQL注入
  • mybatis中#{}防止SQL注入
  • 对请求参数的敏感词汇进行过滤
  • nginx反向代理防止SQL注入

1、PreparedStatement防止SQL注入

PreparedStatement具有预编译功能,以上述SQL为例
使用PreparedStatement预编译后的SQL为:
此时SQL语句结构已固定,无论"?"被替换为任何参数,SQL语句只认为where后面只有一个条件,当再传入 1001 or 1 = 1时,语句会报错,从而达到防止SQL注入效果

2、mybatis中#{}防止SQL注入

mybatis中#{}表达式防止SQL注入与PreparedStatement类似,都是对SQL语句进行预编译处理
注意:
#{} :参数占位符
${} :拼接替换符,不能防止SQL注入,一般用于
  • 传入数据库对象(如:数据库名称、表名)
  • order by 后的条件

3、对请求参数的敏感词汇进行过滤

这里是springboot的写法,如下:

4、nginx反向代理防止SQL注入

越来越多网站使用nginx进行反向代理,该层我们也可以进行防止SQL注入配置。
将下面的Nginx配置文件代码放入到server块中,然后重启Nginx即可
 

评论