MyBatis怎么防止SQL注入?(mybatis如何防sql注入)

2023-12-26 23阅读

MyBatis怎么防止SQL注入?

用#{参数}进行预编译就可以防止了,千万别用${}这种方式注入参数。

MyBatis怎么防止SQL注入?(mybatis如何防sql注入)(图片来源网络,侵删)

mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下:

select id,title,author,content

from blog where id=#{id}

MyBatis怎么防止SQL注入?(mybatis如何防sql注入)(图片来源网络,侵删)

这里,parameterType标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的:

select id,title,author,content from blog where id = ?

不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以这样的方式就很好地避免了sql注入的问题。

MyBatis怎么防止SQL注入?(mybatis如何防sql注入)(图片来源网络,侵删)

mybatis中两个占位符的区别?

mybatis的占位符区别

一、占位符一:#{xxx}

  PreparedStatement 预编译sql语句有?占位符。 xxx表达式的写法。

  参数类型为javabean类, xxx表达式必须和javabean中属性对应的get方法名字一样。

   如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

二、占位符二: ¥{xxx}

  Statement拼接 sql语句没有? 占位符会有SQL注入的漏洞。xxx 表达式的写法。

  参数类型为javabean类, xxx 表达式必须和javabean中属性对应的get方法名字一样,

  如果parameterType传输单个简单类型值,{} 括号中只能是 value。

MySQL中怎么用sql写一个自动增长的字符串,如:yt0001?

MySQL为例,现在项目大部分都用框架实现,比如MyBatis框架,轻量级,功能强大:

在MyBatis中,如果写${变量名},则为直接把传入的值填充到SQL语句中;

如果写#{变量名},则为传入的值只能作为值,放到SQL语句中。

举例:

DELETE FROM student WHERE name=${stu_name}

如果这样写,假如用户恶意传入这样一个字符串:abc OR 1=1,那么整个SQL就变成了

DELETE FROM student WHERE name=abc OR 1=1,结果就是全部数据都删掉了。

这就是SQL注入,如果把${stu_name}换成#{stu_name},那么依然传入上面的字符串,那么SQL是这样的:DELETE FROM student WHERE name=`abc OR 1=1`,会删除名字为abc OR 1=1的学生,没有这个学生则什么都删除不掉,这样就防止了SQL注入。

到此,以上就是小编对于mybatis 防注入的问题就介绍到这了,希望这3点解答对大家有用。

文章版权声明:除非注明,否则均为游侠云资讯原创文章,转载或复制请以超链接形式并注明出处。

目录[+]