为什么此段代码中,Eloquent ORM无法防SQL注入

文档中提到,筛选数据时,使用查询构造器的where可以防止sql注入
在实际操作中,发现无法实现,是不是我的写法有问题:sob:
预想中返回$data为空,但实际上还是返回了id=34的用户数据

Route::get('test/{id}', function ($id) {
    //假如接收的id为这个内容
    $id = "34 and exists (select * from admins where name = 'admin')";
    $data = User::query()->where('id',$id)->first();
    dd($data);
});
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

laravel首先进行处理 到mysql 就是 id = '34 and...' 这种格式, 然后对于int类型的数据 搜索 id = '123abc' 会在底层处理为 id = 123 继续执行

(以上如果我没记错的话,全凭印象)

2年前 评论
讨论数量: 6
chowjiawei

我试了下,我都没有admins表 都可以查出来, 应该是过滤了,正好你的34也是admin让你误以为会注入了吧

2年前 评论

laravel首先进行处理 到mysql 就是 id = '34 and...' 这种格式, 然后对于int类型的数据 搜索 id = '123abc' 会在底层处理为 id = 123 继续执行

(以上如果我没记错的话,全凭印象)

2年前 评论

MySQL 的类型转换引起的,当你在数字类型上查询时,传入了字符串的值,MySQL 会尝试转换类型。

file

你要验证是否存在 sql 注入,可以写作 999999 or 1=1 ,这样如果能查出来内容,才能证明。此处 999999 时一个不存在的 ID,如果存在,请加大

2年前 评论
陈先生

->where('id','[0-9]+'); 为什么不试试路由参数限定呢 :kissing_heart:

2年前 评论

语句用whereraw试下

2年前 评论
颠倒的玉石

我每次都要is_numeric这么一下

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!