Подтвердить что ты не робот

PHP MySQLI Запретить SQL-инъекцию

Я создаю веб-сайт, который скоро будет жить, и у меня есть пара вопросов о предотвращении SQL-инъекций, я понимаю, как использовать mysqli_real_escape_string, но мне просто интересно, нужно ли мне использовать это для всех переменных, которые Я получаю для своего оператора SQL и должен ли я использовать его, когда я делаю также инструкции select или просто вставлять обновления и удалять? Также какую другую безопасность вы бы рекомендовали мне реализовать, прежде чем я разместил сайт в прямом эфире, заблаговременно за любую помощь!

4b9b3361

Ответ 1

Любой запрос может быть введен, будь то чтение или запись, постоянный или временный. Инъекции могут выполняться путем завершения одного запроса и запуска отдельного (возможно с помощью mysqli), что делает ненужным предполагаемый запрос.

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

SELECT col1 FROM t1 WHERE col2 = ?

? является заполнитель для параметра. Используя mysqli, вы можете создать подготовленный оператор с помощью prepare, привязать переменную (аргумент) к параметру с помощью bind_param и запустить запрос с помощью execute. Вам вообще не нужно санировать аргумент (на самом деле это вредно для этого). mysqli делает это для вас. Полный процесс:

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Существует также важное различие между параметризованным запросом и подготовленным оператором. Это утверждение, будучи подготовленным, не параметризуется и, следовательно, уязвимо для инъекций:

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Подводя итог:

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

Ответ 2

Он будет закрыт за считанные секунды, но просто чтобы сделать вещи прямыми

Я понимаю, как использовать mysqli_real_escape_string

Я боюсь, что ты этого не делаешь.

если я должен использовать это для всех переменных, которые я получаю для своего оператора SQL

определенно нет.
эту функцию нужно использовать для форматирования строк SQL только

Мне нужно использовать его, когда я делаю также инструкции select или просто вставлять обновления и удалять?

ЛЮБОЙ оператор SQL. Но опять же, не "используя mysqli_real_escape_string", но полностью и правильно форматируя ваши литералы

И какую другую безопасность вы порекомендуете

относительно безопасности SQL - вы должны правильно форматировать не только строки, но и литералы типа any. И каждый из них требует определенного набора правил форматирования.