Нужно ли очищать пользовательский ввод для запросов DB :: query в laravel?

Читая документацию Laravel, я вижу следующее:

Note: The Laravel query builder uses PDO parameter binding throughout to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings. 

Используется ли это, если я обрабатываю запросы только следующим образом?

 DB::query("SELECT * from table WHERE id like " . $id); 

Давайте возьмем это предложение и подчеркнем ключевую фразу:

Нет необходимости чистить строки, передаваемые как привязки .

В вашем примере $id не передается как привязка, он просто вводится в исходный SQL, поэтому он не защищен .

Вы должны следовать стандартной практике предотвращения SQL-инъекции:

  • в таких случаях, когда вход всегда является целым числом, вы можете использовать intval($id)
  • вы можете получить базовый объект PDO с помощью DB::getPdo() / DB::getReadPdo() и использовать PDO::quote() для правильного удаления строк
  • хотя документация довольно плохая, фасад Laravel DB может запускать полностью параметризованные запросы, такие как DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));

Параметрированные запросы обычно считаются золотым стандартом в предотвращении инъекций, и это то, что Eloquent использует внутренне, когда вы используете построитель запросов. Идея состоит в том, что вы сначала даете базе данных (или, как минимум, драйвер базы данных) полный запрос без ввода пользователя вообще , поэтому нет сомнений в том, какие таблицы и столбцы должны использоваться. Затем вы вводите пользовательский ввод как полностью отдельные данные , которые никогда не записываются в SQL, а просто применяются к уже отправленному запросу.

Параметрированные запросы не могут сделать все для вас, хотя, например, большинство библиотек, включая PDO, не могут связывать имя таблицы или столбца в качестве параметра . Это связано с тем, что при каждом запуске он будет создавать разные запросы, что отрицает разделение между запросом и данными. Если вы хотите это сделать, вам необходим какой-то другой метод обеспечения безопасности – как правило, наилучшим вариантом является белый список допустимых значений.

Нет, DB :: query () не является частью концепции Query Builder. Вместо этого это будет защищено:

 DB::table('table')->where('id', 'like', $id)->get(); 

Но лучший способ защитить ваши запросы – использовать Query Builder с максимальным значением:

 DB::table('table')->where('id', 'like', $id)->get(); 

Другой способ защитить ваши запросы, если вы действительно вынуждены писать необработанный запрос, заключается в том, чтобы передавать ваши данные в тип, которым они должны быть:

 DB::query(DB::raw("SELECT * from table WHERE id like " . (int) $id)); 

В этом случае, если $id является 'some exploit' запрос будет:

 SELECT * from table WHERE id like 0 

В Query Builder вы также можете передать свои параметры (привязки), как это, чтобы усилить безопасность ваших запросов:

 DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));