В этой статье мы поговорим как происходит защита форм в языке программирования PHP, расскажу всё максимально понятно и подробно.
Также, перед прочтением статьи, можете прочитать
«Как сделать систему авторизации и регистрации на PHP».
Защита от ботов:
Пожалуй зашита от ботов самая простая, для этого вам надо создать капчу, для этого на сайте есть пару статей.
Лично я рекомендую использовать для этого Google ReCAPTCHA, так как это наиболее эффективный способ и подключение не очень сложное.
XSS защита в PHP:
XSS защита в PHP очень простая, у вас есть два способа, первый, через регулярные выражения, второй, через специальный функции, рассмотрим их оба.
Для тех кто не знает, что такое XSS атака, это когда в форму встраивают JS код, к примеру, и потом, когда другие пользователи видят это сообщение, у них может что-то ломаться, или даже забираться какие-то данные.
Регулярные выражения:
Суть в том, что после отправки формы, на сервере будут проходить проверку данные, которые прислал клиент, на PHP для этого будем использовать функцию preg_match()
, которая находит первое попавшийся совпадение, но для начала взгляните на список самых полезных выражения.
- «
/^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i
» — Проверка Email; - «
/^[a-z0-9_-]{3,16}$/
» — Простой логин; - «
/^\+?(\d{1,3})?[- .]?\(?(?:\d{2,3})\)?[- .]?\d\d\d[- .]?\d\d\d\d$/
» — Номер телефона; - «
/^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8,}$/
» — Сложный пароль;
Теперь сделаем не большую программу на языке программирования PHP, вот как выглядит форма.
1 2 3 | <form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="get"> Введите Email: <input type="email" name="email"> </form> |
Тут просто отправляем форму прямо в этот же скрипт, где она находится, вот сама не большая программа.
1 2 3 4 5 6 7 | $email = $_GET["email"]; if (preg_match("/^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i", $email)) { echo "Email верный"; } else { echo "Email не верный"; } |
Вот результат если введём правильный Email.
Тут стоит сказать, что так как, мы использовали тип поля «email», у нас автоматически будет проверятся, что введён именно он, но проверку всё равно надо делать, потому что злоумышленник может отправить данные отдельно, например вписав их в URL, тем более когда используете GET.
Также, у этого способа есть не большой минус, он медленный, и им сложно заменять знаки, что бы код не в запросе не заработал, когда будет выводится в HTML, поэтому используете функции.
Функции:
Теперь разберём какие есть функции для проверки и защиты от XSS, их всего две, вот они.
- filter_var() — Фильтрует переменные, в основном используется для проверки Email;
- htmlspecialchars() — Функция нужна для замены некоторых знаков в строке, на HTML формат что бы браузер не понял программы.
Если с htmlspecialchars()
всё понятно, вы просто в качестве параметра передаются строка, которую надо изменить, и возвращается она изменённая.
filter_var()
используется в основном для проверки Email, но об этом подробнее прочитайте в статье «Проверка email в PHP на валидность», в остальном больше нечего рассказать, также посмотрите ссылку, там чуть больше узнаете о этой фукции.
Защита от SQL инъекций в PHP:
Про защиту от SQL инъекций в PHP, всё достаточно просто, вам нужно использовать класс PDO, для примера сделаем не большую функцию.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function query($sql, $params = [], $pdo) { // Сначала подготавливаем запрос для его изменений $stmt = $pdo -> prepare($sql); // Проверяем, есть ли параметры которые мы отправили if (!empty($params)) { // Цикл для подстановки данных foreach ($params as $key => $val) { // Подставляем данные $stmt -> bindValue(':'.$key, $val); } } // Подготавливаем запрос для выполнения $stmt -> execute(); // Возвращаем запрос return $stmt; } |
Это достаточно сложный код, поэтому расскажу саму суть, дело в том, что мы будем в SQL запросе оставлять грубо говоря не большие метки, которые будем потом заменять на значения из массива, используете эту функцию для зашиты, также подробнее про защиту и PDO, узнаете из ссылки.
Ещё если не хотите использовать PDO, то рекомендую как минимум пользоваться классом mysqli
он тоже хорошо зашищён, а ещё лучше использовать библиотеку RedBean, там уже из коробки есть очень хорошая защита и построен на базе PDO, но при этом более простой.
Также для защиты от SQL инъекций подойдёт функция, о которой говорили пунктом выше, filter_var()
.
Вывод:
В этой статье вы прочитали как происходит защита форм на языке программирования PHP, всё очень просто.