使用原始 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,
));
我知道每个人都在使用 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,
));