Метод orderBy () в Laravel обеспечивает защиту от внедрения SQL? - PullRequest
0 голосов
/ 05 октября 2018

Метод orderBy () в Laravel обеспечивает защиту от SQL-инъекций?

Ex: 
$column = "SUBSTRING_INDEX(material_type, '\\\', -1)";
$sort = 'desc';
DB::table('students')->orderBy(DB::raw($column), $sort)->get();

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Если вы используете DB::raw($text), то нет.то, что находится внутри $text, входит в запрос как есть.

Как и предполагалось, используйте:

DB::table('students')->orderby($column, $sort);

в этом случае, да, метод orderBy() в Laravel обеспечивает защиту от внедрения SQLпоскольку переменные будут передаваться как привязки.

PS: это одинаковый случай для всех методов eloquent.если вы используете DB::raw(), вам нужно быть очень осторожным.

0 голосов
/ 05 октября 2018

->orderBy(DB::raw($column), $sort) является не безопасным, необработанные выражения всегда уязвимы для SQL-инъекций.

Вы можете использовать ->orderBy($column, $sort), но я бы не рекомендовал его.

Laravel не использует привязку параметров для имен столбцов, поскольку базовый PDO не поддерживает его ( ссылка ).Привязки параметров могут использоваться только только для значений (where name = ?).

Laravel пытается предотвратить SQL-инъекции через имя столбца ( ссылка ), но я бы не сталне надейся на это.Я предполагаю, что у вас есть список разрешенных имен столбцов, поэтому используйте его в качестве белого списка:

$columns = ['id', 'name', 'created_at', ...];
if(!in_array($column, $columns, true)) {
    // Throw an exception or set $column to a secure default value.
}

Laravel использует asc в качестве направления по умолчанию, если предоставленное значение недопустимо ( ссылка ).
Так что я бы сказал, что вам не нужно проверять $sort самостоятельно.

0 голосов
/ 05 октября 2018

Короче, ДА.

Измените ваш код с

DB::table('students')->orderby(DB::raw($column), $sort);

на

DB::table('students')->orderBy($column, $sort);

Почему?

Laravelпостроитель запросов использует привязку параметров PDO для защиты вашего приложения от атак SQL-инъекций.Нет необходимости чистить строки, передаваемые как привязки.

Документ Laravel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...