Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用原始SQL时,Laravel自然会阻止SQL注入吗?_Sql_Laravel_Sql Injection - Fatal编程技术网

在使用原始SQL时,Laravel自然会阻止SQL注入吗?

在使用原始SQL时,Laravel自然会阻止SQL注入吗?,sql,laravel,sql-injection,Sql,Laravel,Sql Injection,我知道每个人都在使用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注入的防御 这

我知道每个人都在使用
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()
方法完成的。让我们看看
illighted\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,
     ));

当您将任何变量连接/插入查询字符串中时,就不会出现这种情况。如果将它们作为参数传递到数组中,那么是的——毕竟,这就是将查询字符串从参数列表中分离出来的要点。如果我只使用问号方法呢?谢谢,我现在还不太确定,但是你可以试一下,就像它有你需要的一切一样。如有其他疑问,欢迎询问。