首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于将查询生成器与DB::raw()组合在一起的查询,防止SQL注入

对于将查询生成器与DB::raw()组合在一起的查询,防止SQL注入
EN

Stack Overflow用户
提问于 2014-10-31 09:09:09
回答 2查看 9.6K关注 0票数 8

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

代码语言:javascript
运行
复制
$field = 'email';
$user = DB::table('users')->select(DB::raw("$field as foo"))->whereId(1)->get();

我读过克里斯·菲道的教程,它可以将绑定数组传递给select()方法,从而通过使用准备好的语句正确地防止SQL注入。例如:

代码语言:javascript
运行
复制
$results = DB::select(DB::raw("SELECT :field FROM users WHERE id=1"), 
               ['field' => $field]
           ));

这是可行的,但该示例将整个查询放入raw语句中。它不将查询生成器与DB::raw()组合在一起。当我使用第一个例子尝试类似的东西时:

代码语言:javascript
运行
复制
$field = 'email';
$user = DB::table('users')->select(DB::raw("$field as foo"), ['field' => $field])
             ->whereId(1)->get();

..。然后我得到一个错误:strtolower()期望参数1是string,数组给定

对于将查询生成器与DB::raw()组合在一起的查询,防止SQL注入的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-03 12:16:18

我发现查询生成器有一个名为setBindings()的方法,可以在这个实例中使用:

代码语言:javascript
运行
复制
$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();
票数 8
EN

Stack Overflow用户

发布于 2014-10-31 12:18:01

雄辩地使用引擎盖下的PDO来净化物品。它不会清理添加到SELECT语句中的项。

然而,字符串方法对于清理strings仍然很有用。

还可以考虑(或者相反)从used表中保留一个有效的字段名数组,并对照它进行检查,以确保没有使用无效的值。

代码语言:javascript
运行
复制
$allowedFields = ['username', 'created_at'];

if( ! in_array($field, $allowedFields) )
{
    throw new \Exception('Given field not allowed or invalid');
}

$user = DB::table('users')
            ->select(DB::raw("$field as foo"))
            ->whereId(1)->get();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26670933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档