Это хорошая идея использовать:
// input can only contain numbers letters
if (preg_match('/^[a-zA-Z0-9_\-\.]+$/', 'input')) {}
Поможет ли это предотвратить SQL-инъекции ?
и сделать сайт более безопасным?
Я начну с того, что вам абсолютно необходимо использовать Подготовленные операторы 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;
Хотя маловероятно, что злоумышленник сможет это осуществить, это может случиться, и если это произойдет, злоумышленник может получить каждое имя пользователя и пароль из совершенно другой пользовательской таблицы.
Используйте подготовленные операторы и забудьте о решении этой проблемы самостоятельно.
Заявления настолько хороши, насколько это возможно. Если они недостаточно безопасны, у вас есть другая (более серьезная) проблема.
я использую подготовленные операторы, но мне нужно больше безопасности и совершенства для моего веб-приложения.