首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用原始SQL时,Laravel自然地防止SQL注入吗?

问当使用原始SQL时,Laravel自然地防止SQL注入吗?
EN

Stack Overflow用户
提问于 2018-05-15 08:17:42
回答 1查看 3.4K关注 0票数 1

我知道每个人都在使用DB::raw()执行原始sql。

我自己使用以下方法:

代码语言:javascript
复制
DB::select("query string?", [$var]);
DB::insert("query string?", [$var]);
DB::update("query string?", [$var]);
DB::delete("query string?", [$var]);

Laravel是否已经为SQL注入提供了防御,或者我仍然需要逃避我的变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-15 08:59:13

是的,laravel为sql注入提供了防御。

这是因为查询生成器在后台使用PDO,因此我们知道有一种将参数绑定到查询的方法,因此它将清理绑定的变量。

现在,正如您所看到的,任意(原始)查询是在查询生成器中使用例如DB::select()方法完成的。让我们看看select()方法在Illuminate\Database\Connection中,看看它是否有任何方法绑定我们的参数。让我们深入研究:

代码语言:javascript
复制
      public function select($query, $bindings = [], $useReadPdo = true)
{
    return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {
        if ($this->pretending()) {
            return [];
        }

        // For select statements, we'll simply execute the query and return an array
        // of the database result set. Each element in the array will be a single
        // row from the database table, and will either be an array or objects.
        $statement = $this->prepared($this->getPdoForSelect($useReadPdo)
                          ->prepare($query));

        $this->bindValues($statement, $this->prepareBindings($bindings));

        $statement->execute();

        return $statement->fetchAll();
    });
}

您的查询可以如下所示:

代码语言:javascript
复制
    $someVariable = Input::get("some_variable");
    DB::select("SELECT * FROM some_table WHERE some_col = :somevariable", array(
       'somevariable' => $someVariable,
     ));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50345442

复制
相关文章

相似问题

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