• 博客园Logo
  • 首页
  • 新闻
  • 博问
  • 专区
  • 闪存
  • 班级
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 简洁模式 ... 退出登录
    注册 登录
京亟
很多时候,我们以为面前是大海、是沟壑、是深渊,但是当你越过去回头再看的时候,那不过是溪流、是台阶、是浅滩。 联系方式:jinqiqaq@foxmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

Mybatis下的sql注入

以前只知道mybatis框架下,order by后面接的是列名是不能用#{},这样不起效果,只能用${},这样的话就可能产生sql注入。后来发现其实还有另外两种情况也是类似的:

1.order by ${} asc

像这种情况最好的办法是在java层面上做映射,比如说用户只能输入1-5,然后在代码层面将其映射为字段名,然后再使用${}

2.

Select * from news where id in (#{id})  这样写会报错

防范方法:使用mybatis自带的循环指令

select * from news where id in

<foreach collection="ids" item="item" open="("separator="," close=")">#{item} </foreach>

3.模糊查询

Select * from news where title like ‘%#{title}%’, 这样写会报错

方法方法:  select * from news where tile like concat(‘%’,#{title}, ‘%’)

 

4.

https://www.anquanke.com/post/id/190170   
mybatis 需要注意的一个有意思的地方
看是否有自己造轮子的addCriterion()第一个参数时condition,观察是否有字符串拼凑,模糊查询的地方容易出问题

 

 

----------------------------2019.4.1------------------------

补充一下这个可能是mysql的问题,java使用原生的jdbc也有这样的问题,php也是

 

 

 

-----------------------2019.11.7----------------------

php使用PDO依然可能存在sql注入的三种情况

1.sql语句依然使用字符串拼凑,导致PDO

2.预编译的变量名可以修改

$dbh=new PDO('mysql:host=localhost;dbname=test_data','root','');
$sql="SELECT * FROM `users` WHERE `id`=:".$_GET['id'];
$sth=$dbh->prepare($sql);
$sth->execute(array(":id"=>1));
3.本地模拟预编,依然可能存在宽子节注入
正确做法是:$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
posted @ 2018-12-07 16:42  京亟QAQ  阅读(817)  评论(0)  编辑  收藏  举报
刷新评论刷新页面返回顶部
Copyright © 2022 京亟QAQ
Powered by .NET 6 on Kubernetes