Да, laravel обеспечивает защиту от SQL-инъекций.
Это связано с тем, что, поскольку построитель запросов использует PDO в фоновом режиме, мы знаем, что есть способ привязать параметры к нашему запросу, чтобы он очистил связанные переменные.
Теперь, как вы видели, произвольные (необработанные) запросы выполняются в конструкторе запросов с использованием, например, метода DB::select()
.Давайте посмотрим на метод select()
в Illuminate\Database\Connection
, чтобы увидеть, есть ли у него какой-либо способ связать наши параметры.Давайте углубимся в это:
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,
));