Я создаю веб-сайт, который скоро будет жить, и у меня есть пара вопросов о предотвращении SQL-инъекций, я понимаю, как использовать mysqli_real_escape_string
, но мне просто интересно, нужно ли мне использовать это для всех переменных, которые Я получаю для своего оператора SQL и должен ли я использовать его, когда я делаю также инструкции select или просто вставлять обновления и удалять? Также какую другую безопасность вы бы рекомендовали мне реализовать, прежде чем я разместил сайт в прямом эфире, заблаговременно за любую помощь!
PHP MySQLI Запретить SQL-инъекцию
Ответ 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. И каждый из них требует определенного набора правил форматирования.