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