为什么此段代码中,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);
});
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

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年前 评论

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