gpt4 book ai didi

laravel - 防止将查询生成器与 DB::raw() 组合在一起的查询进行 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-12-04 05:37:13 32 4
gpt4 key购买 nike

在 Laravel 4 中,我想保护一些复杂的数据库查询免受 SQL 注入(inject)。这些查询使用查询生成器和 DB::raw() 的组合。这是一个简化的示例:

$field = 'email';
$user = DB::table('users')->select(DB::raw("$field as foo"))->whereId(1)->get();
我已阅读 Chris Fidao's tutorial可以通过使用准备好的语句将绑定(bind)数组传递给 select() 方法,从而正确地防止 SQL 注入(inject)。例如:
$results = DB::select(DB::raw("SELECT :field FROM users WHERE id=1"), 
['field' => $field]
));
这可行,但该示例将整个查询放入原始语句中。它没有将查询生成器与 DB::raw() 结合起来。当我使用第一个示例尝试类似的操作时:
$field = 'email';
$user = DB::table('users')->select(DB::raw("$field as foo"), ['field' => $field])
->whereId(1)->get();
...然后我得到一个错误: strtolower() 期望参数 1 是字符串,给定数组
对于将查询构建器与 DB::raw() 结合起来的查询,防止 SQL 注入(inject)的正确方法是什么?

最佳答案

我发现查询生成器有一个名为 的方法。 setBindings() 在这种情况下可能很有用:

$field = 'email';
$id = 1;
$user = DB::table('users')->select(DB::raw(":field as foo"))
->addSelect('email')
->whereId(DB::raw(":id"))
->setBindings(['field' => $field, 'id' => $id])
->get();

关于laravel - 防止将查询生成器与 DB::raw() 组合在一起的查询进行 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26670933/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com