Нет, ваше регулярное выражение вообще не поможет с внедрением SQL, извините. Давайте посмотрим на некоторые SQL-инъекции:
Сначала предположим, что вы создаете команды SQL в виде строк, например:
snprintf( sqlcommand, dimensionof(sqlcommand), "INSERT INTO users (username, password) VALUES ('%s', '%s')", username, password );
Проблема с внедрением SQL заключается в том, что пользователь может создать входное значение (в данном случае имя пользователя или пароль), которое заставит сгенерированную команду SQL сделать что-то другое, чем предполагалось. Например, если имя пользователя было «aardvark», «f»); DROP / ** / TABLE / ** / users; - », то сгенерированный оператор SQL будет выглядеть так:
INSERT INTO users (username, password) VALUES ('aardvark','f');DROP/**/TABLE/**/users;--', 'password_value')
Итак, вы пропустили своим регулярным выражением несколько моментов:
- Обычный метод «выделения» из строки SQL включает неэкранированные символы одинарных кавычек.
- / ** / - это разделитель, но не пробел.
А вам не следует исправлять это регулярное выражение . Как ответили другие, такой подход фильтрации входных данных опасен. По крайней мере, вы можете позвонить на mysql_real_escape_string()
, рекомендованный Cletus.
Однако лучший ответ у Джиши и Марка Байерса: использовать параметризованные SQL-запросы, а не создавать SQL-запросы из строковых манипуляций. Этот подход безошибочен по сравнению с обработкой входных данных для экранирования необходимых символов.
Пожалуйста, примите ответы Джиши или Марка Байерса, так как они были самыми ранними и правильными.