Я создаю веб-сайт, который скоро будет жить, и у меня есть пара вопросов о предотвращении 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 – вы должны правильно форматировать не только строки, но и литералы любого типа. И каждый из них требует определенного набора правил форматирования