PHP MySQLI Запретить SQL Injection

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

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

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

 SELECT col1 FROM t1 WHERE col2 = ? 

? является заполнитель для параметра. Используя mysqli , вы можете создать подготовленный оператор, используя prepare , связать переменную (аргумент) с параметром using 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])"); 

Обобщить:

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

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

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

Боюсь, что нет.

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

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

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

ЛЮБАЯ инструкция SQL. Но опять же, не «используя mysqli_real_escape_string», а полностью форматируя ваши литералы

Также какую другую безопасность вы бы рекомендовали

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