用#{参数}进行预编译就可以防止了,千万别用${}这种方式注入参数。
创新互联建站于2013年成立,是专业互联网技术服务公司,拥有项目成都网站设计、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元金州做网站,已为上家服务,为金州各地企业和个人服务,联系电话:028-86922220
mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下:
select id,title,author,content
from blog where id=#{id}
这里,parameterType标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的:
select id,title,author,content from blog where id = ?
不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以这样的方式就很好地避免了sql注入的问题。
mybatis的占位符区别
一、占位符一:#{xxx}
PreparedStatement 预编译sql语句有?占位符。 xxx表达式的写法。
参数类型为javabean类, xxx表达式必须和javabean中属性对应的get方法名字一样。
如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。
二、占位符二: ¥{xxx}
Statement拼接 sql语句没有? 占位符会有SQL注入的漏洞。xxx 表达式的写法。
参数类型为javabean类, xxx 表达式必须和javabean中属性对应的get方法名字一样,
如果parameterType传输单个简单类型值,{} 括号中只能是 value。
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点解答对大家有用。
分享名称:MyBatis怎么防止SQL注入?(mybatis如何防sql注入)
本文URL:http://www.mswzjz.cn/qtweb/news37/285137.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能