Как мне безопасно хранить предполагаемые атаки с использованием SQL-инъекций в базе данных?

#php #sql-injection

#php #sql-инъекция

Вопрос:

Как мне сохранить потенциальные атаки с использованием SQL-инъекций в базе данных?

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

Что мне нужно сделать, чтобы безопасно вставить эти строки в базу данных, чтобы не возникало ошибок?

У меня такое чувство, что это будет что-то вроде htmlspecialchars и mysql_real_escape_string… но я хотел выложить это там, чтобы посмотреть, есть ли у кого-нибудь еще какие-нибудь идеи!

Одной из идей было сохранить атаку в виде закодированного значения base64, но это кажется немного хакерским…

К вашему сведению, я пишу приложение на PHP 🙂

Мы будем очень признательны за любые ответы!

Комментарии:

1. Если вы храните атаки в базе данных, то что не так с base64? Это не «хакерство», это делает хранение безопасным.

2. Строго с личной точки зрения, я бы сохранил это в файле на сервере (со ссылкой на файл в базе данных). Я езжу по ftp как минимум ежедневно, что упрощает проверку одного-двух файлов.

Ответ №1:

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

например:

 $statement = $db->prepare('INSERT INTO table_name (field_name1, field_name2) VALUES (:value, :value2)');
$statement->execute(array(':value' => $value, ':value2' => $value2));
  

Смотрите документацию по подготовке PDO здесь:

http://www.php.net/manual/en/pdo.prepare.php

Ответ №2:

Используйте подготовленные инструкции mysqli для хранения запросов, это самый безопасный метод избежать sql-инъекции. Если вы собираетесь отображать их через веб-интерфейс и обеспокоены атаками XSS / CSRF, используйте htmlspecialchars() перед их отображением.

Ответ №3:

Таким же образом вы сохраняете любые другие данные.
В хранении атак с использованием SQL-инъекций нет ничего особенного, как бы вы это ни называли.

Ответ №4:

Как сказал Стив Мэйн … пожалуйста, используйте соединение php PDO с подготовленными инструкциями. Сейчас это безопасно. Больше не используйте mysql_connect() и подфункции, потому что они старые, и вы не можете в полной мере использовать новые mysql / sql / etc .. функции .

Ответ №5:

Все, что я бы сделал, это запустил его с помощью простого шифрования. Затем, когда вы захотите показать предполагаемый sql, вы просто расшифруете его. Это должно гарантировать, что предполагаемая инструкция sql не будет выполнена в вашей базе данных.

Комментарии:

1. Шифрование излишне, достаточно правильно экранировать строки или использовать подготовленные инструкции.

2. Исключение злоумышленник, который знает используемое шифрование, может создать инструкцию, зашифрованная форма которой выполняет SQL-инъекцию. Это действительно неправильный способ решения проблемы.

3. Я не говорил, что это был бы лучший способ сделать это или самый безопасный, но вы также могли бы сказать, что экранирование строк также является формой шифрования, вы берете оригинал, изменяете его и сохраняете результат.

4. Экранирующие строки — это форма кодирования . Шифрование и кодирование — это две разные вещи. Кодирование предназначено для обеспечения безопасности данных при хранении и / или транспортировке. Шифрование, не так сильно — зашифрованные данные могут быть такими же опасными, как и открытый текст, иногда даже более опасными, в зависимости от используемой схемы. Это просто менее читабельно для незнакомых людей, что здесь не обязательно.