使用原始 SQL 时 Laravel 会自然地防止 SQL 注入吗?

Does Laravel naturally prevent SQL injection when using raw SQL?

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

我自己使用以下代替:

DB::select("query string?", [$var]);
DB::insert("query string?", [$var]);
DB::update("query string?", [$var]);
DB::delete("query string?", [$var]);

Laravel 是否已经提供了针对 SQL 注入的防御,或者我仍然需要转义我的变量?

是 laravel 提供防御 sql 注入。

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

现在,如您所见,任意(原始)查询是在查询构建器中使用例如 DB::select() 方法完成的。我们再看看Illuminate\Database\Connection中的select()方法,看它有没有办法绑定我们的参数。让我们深入探讨一下:

      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();
    });
}

您的查询可以如下所示:

    $someVariable = Input::get("some_variable");
    DB::select("SELECT * FROM some_table WHERE some_col = :somevariable", array(
       'somevariable' => $someVariable,
     ));