Классический пример
Запрос SELECT * FROM users WHERE email = '{$email}' с вводом ' OR 1=1 -- превращается в WHERE email = '' OR 1=1 --' — и возвращает всех пользователей.
Защита
- Параметризованные запросы / Prepared Statements — единственный надёжный способ. Данные и SQL-код всегда разделены на уровне протокола БД
- ORM — большинство современных ORM используют prepared statements автоматически
- Whitelist-валидация — проверять, что значение входит в разрешённый список, а не просто экранировать
- Никогда не подставляйте данные пользователя напрямую в SQL-строку, даже после
addslashes()