Проверка данных формы на PHP


При получении данных из HTML-формы, прежде, чем они будут записаны в базу данных, их необходимо проверить, чтобы избежать неприятностей, когда какой-то злоумышленник пытается «поломать» ваш сайт. В чем обычно заключается проверка данных? Чаще всего проверяется соответствие типа данных, использование только разрешенных символов, отсутствие специальных тегов (например, javascript). Кроме того, делается «экранирование» кавычек, чтобы запросы к базе данных не привели к ошибкам или не повредили ее содержимое (sql-иньекции).

Допустим, у нас есть небольшая форма:

1
2
3
4
5
6
<form action="action.php" method="post">
    <p>Ваше имя: <input type="text" name="name" /></p>
    <p>Ваш email: <input type="text" name="email" /></p>
    <p>Ваш возраст: <input type="text" name="age" /></p>
    <p><input type="submit" value = "Отправить" /></p>
</form>

При получении данных:
1. Преобразуем спецсимволы и теги html с помощью функции htmlspecialchars:

1
2
3
4
<?php
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$age = htmlspecialchars($_POST['age']);

2. Приведем данные к нужному типу (в нашем случае возраст должен быть целым числом):

1
$age = (int) $age;

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

Остальные переменные могут содержать как числа, так буквы, поэтому преобразование типа принудительно не делаем.

3. Проверка допустимых символов или наличие обязательных символов. Например, нам необходимо проверить email. По этому поводу ведутся большие дискуссии, например, здесь. Ограничимся проверкой наличия собачки в адресе:

1
if (strpos($email, '@')) echo 'E-mail валидный';

4. Экранирование строковой переменной перед выполнением sql-запроса. Воспользуемся функцией mysql_real_escape_string:

1
2
$name = mysql_real_escape_string($name);
$email = mysql_real_escape_string($email);

Переменная $age у нас принудительно приведена к типу integer, соответственно, лишних символов здесь точно не будет и экранировать ничего не нужно.

Теперь данные можно записать в базу.





Другие посты

Категория: PHP-скрипты

Оставить комментарий