本文详解 laravel 应用中通过用户输入拼接数据库列名(如 product_varient_var)所引发的 sql 注入隐患,并提供基于白名单校验、请求验证与运行时防护的多重安全实践方案。 本文详解 laravel 应用中通过用户输入拼接数据库列名(如 product_varient_var)所引发的 sql 注入隐患,并提供基于白名单校验、请求验证与运行时防护的多重安全实践方案。在 Laravel 开发中,直接将用户可控变量拼接到 SQL 查询字符串(尤其是列名、表名、排序字段等非数据上下文)是典型的高危操作。尽管 Laravel 的查询构造器默认对 参数值(如 where() 中的条件值)自动转义,但它完全不处理列名、表名或原始 SQL 片段中的动态标识符。这意味着如下代码存在严重 SQL 注入风险:var = request->input('variant_id'); // 假设用户传入 '1 UNION SELECT password FROM users--'sample = DB::table('products')-\>select("product_varient_var") ->distinct() ->get();上述语句最终可能生成非法但可执行的 SQL:SELECT DISTINCT `product_varient_1 UNION SELECT password FROM users--` FROM `products`虽然该示例因语法错误可能报错,但攻击者可精心构造有效 payload(例如利用反引号闭合、注释绕过、或结合 ORDER BY / GROUP BY 等上下文),实现列名注入、信息泄露甚至联合查询。? 正确防护的核心原则是:永远不信任用户输入作为 SQL 标识符,必须严格白名单校验。? 推荐防护方案(三重保障)1. 请求级验证(推荐首选)使用 Laravel 内置的 validate() 方法,在控制器入口强制约束输入值范围:public function index(Request request){ validated = request-\>validate(\[ 'variant_id' =\> 'required\|integer\|in:1,2,3', \]); var = validated\['variant_id'\]; column = "product_varient_{var}"; sample = DB::table('products') ->select(column) -\>distinct() -\>get(); return response()-\>json(sample);}?? 注意:in:1,2,3 规则会自动将字符串 '1' 转为整型 1,并拒绝 '1 OR 1=1' 等非法值,且返回标准化 422 错误响应。 幻导航网 发现优质实用网站,开启网络探索之旅!
相关推荐
曲幽7 小时前
FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好素材积累8 小时前
博士后出站来深可申请的项目补贴等装不满的克莱因瓶8 小时前
掌握 RNN 与 LSTM 模型结构何以解忧,唯有..8 小时前
Python包管理工具pip:从入门到精通金銀銅鐵8 小时前
用 Tkinter 实现简单的猜数字游戏copyer_xyf9 小时前
Python 模块与包的导入导出_1_79 小时前
SQL Server 磁盘满了 收缩日志ice8130331819 小时前
【Python】Matplotlib折线图绘制copyer_xyf9 小时前
Python venv 虚拟环境basketball6169 小时前
Redis基础:1. Redis介绍