最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险。
order by ${orderby}
很简单的一个排序字段,但是因为使用 ${} 占位符的原因,有sql注入的风险,相信大家平时也经常会使用这个占位符,不知道有没有考虑sql注入的问题,下面简单介绍下 #{} 和 ${} 的区别以及为什么使用 ${} 会有sql注入的问题。
public map<string,string> indexmap=new hashmap<string,string>(快速有效的减肥方法){ { put("spaceid","space_id"); // key为前端传的值,value为数据库对应的列值 put("opttime","opt_time"); } };当传参时,判断参数是否在map的key中,如果存在的话,就把对应的value作为排序的依赖条件。
if(paramoptlog.getorderby()!=null &&strings.isnullorempty(paramoptlog.getorderby())){ optlog optlog=new optlog(); paramoptlog.torderby(optlog.indexmap.getordefault(paramoptlog.getorderby(), "id")); } list<optlog> list = optlogmapper.query4page(paramoptlog); }总结就是通过映射,由程序员来决定 ${} 传的参数,即将动态sql转成静态sql的方式可以解决这个问题,这样在实际调用的时候就不会有sql注入的风险了。
不会进行预编译,会被sql注入
注入方式如下:
密码随便输一个就可以通过验证,只要用户名正确即可。
这样输入后查询语句在数据库中如下:
lect id,urname,password from urlogin where urname='admin' or 1=1 and password='23'
sql解释:and优先级高于or 首先判断后面1=1 and password=’23’为fal,然后判断前面urname=’admin’为true中间
连接为or即最后为true or fal 最后还是为true,就直接通过验证,能够正常登陆admin用户。
这样会进行预编译,能够防止sql注入。sql注入只有在编译时才有效,而预编译的时候是用个?代替参数,真正执行时才把参数替换?。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 03:14:28,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4d67953622646bb6643738be4efb72bb.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:关于mybatis使用${}时sql注入的问题.doc
本文 PDF 下载地址:关于mybatis使用${}时sql注入的问题.pdf
留言与评论(共有 0 条评论) |