Проверка пользовательского ввода с использованием регулярного выражения для предотвращения инъекции sql

Это хорошая идея использовать:

// input can only contain numbers letters
if (preg_match('/^[a-zA-Z0-9_\-\.]+$/', 'input')) {}

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
1 715
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Ваш шаблон может блокировать определенные типы SQL-инъекций. Например, предположим, что у вас есть следующий SQL-запрос:

SELECT col1, col2 FROM some_table WHERE col = ?;

Ваш шаблон регулярного выражения не позволит кому-либо внедрить 'value'; DELETE FROM some_table в запрос. Это связано с тем, что ваш шаблон регулярного выражения не допускает точку с запятой.

Однако существуют и другие типы инъекционных атак, которые не включают цепочку дополнительных (вредоносных) операторов. Также могут происходить атаки объединения, и ваше текущее регулярное выражение позволяет это сделать. Рассмотрите возможность внедрения следующего фрагмента:

'value' UNION ALL SELECT username, password FROM users

Это даст следующий полный SQL-запрос:

SELECT col1, col2 FROM some_table WHERE col = 'value'
UNION ALL
SELECT username, password FROM users;

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

Используйте подготовленные операторы и забудьте о решении этой проблемы самостоятельно.

я использую подготовленные операторы, но мне нужно больше безопасности и совершенства для моего веб-приложения.

Vandalin 18.12.2020 11:27

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

Tim Biegeleisen 18.12.2020 11:28

Другие вопросы по теме