Выполнен анализ проблем, которые возникают при проверке корректности данных в web-приложениях. Предложены методики проверки корректности ввода данных на основе функций PHP и защиты от SQL-инъекций.
Разработка надежных приложений - цель каждого разработчика. Правильность ввода первичных данных в приложение является одним из основных методов, используемых для повышения надежности приложения. В web-приложении пользователь обеспечивает ввод, чтобы манипулировать приложением. При вводе данных могут возникнуть ошибки во время набора вводимой информации [1]. «Проверка ввода» является практикой программирования, в котором разработчик web-приложения пытается обнаружить неправильные входные данные пользователя и сделать соответствующее предупреждение. Необходимость проверки объясняется следующим: при разработке серьезных web-приложений есть много причин, которые могут навредить стабильной работе приложения и целостности данных. Во время написания приложения сценарии отказа возникают, один за другим и должны быть обработаны разработчиком. Здесь потребуется обработка данных введенных пользователем, обработка приведет к снижению сценариев отказа в значительной степени. «Проверка входных данных» позволяет быть уверенным и сосредоточить внимание на основах приложения, а не тратить время обработки каждого случая входных данных [2].
Существуют различные способы [3], через которые к web-приложению получат доступ:
- Веб-формы.
- Клиентские приложения.
- Приложения и службы.
- Файлы на основе записей.
Поэтому для стабильной работы приложений необходимо, чтобы все эти входы проверялись по определенными правилами. Для этого у каждого поля должен быть определенный тип данных и ограничительные условия для каждого поля ввода, этот процесс проверки будет охватывать большинство входных сценариев почти для всех приложений.
Различают несколько методов проверки вводимых данных на корректность [4]:
- Ограничение длины вводимой информации.
Если от пользователя требуется ввести текст не более некоторого количества символов, можно, конечно, задать свойство maxlength у соответствующего input'а, но этот вариант не безопасен, ибо данные могут придти и в обход формы. Поэтому для этих целей лучше использовать функцию substr:
$variable = substr($HTTP_POST_VARS['variable'], 0, 10);
- Проверка на наличие специальных символов.
Перед вставкой принятых от пользователя строковых данных в БД их следует проверить на наличие спецсимволов и экранировать их. Лучше всего для этого использовать функцию mysql_escape_string:
$sql = »INSERT INTO table VALUES \»« . mysql_escape_string($text)
- Числовые данные.
Если пользователем передаются числовые данные, то перед использованием рекомендуется их проверить на то, действительно-ли они являются числами. Делается это с помощью функции intval:
$myint = intval($_POST['myint']);
- Проверка на корректность адреса Email.
Прежде, чем отправлять на указанный пользователем email-адрес какие-либо письма, необходимо будет выполнить проверку его корректности.
Код, выполняющий проверку данного типа:
if(!preg_match(«/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/», $email)) die(«некорректный email-адрес»);
- Проверка на заполнение необходимых полей.
Ниже приведен код, выполняющий проверку на заполнение полей данными:
if ($name == »« or $mail == »« or $password == »« or $rpassword == »«)
{ print »Заполните все необходимые поля!<BR>«; $er = 1; }
Переменная $er = 1 означает, что была ошибка [5].
В настоящий момент при использовании современных средств internet-технологий появилась возможность через поля ввода в web-приложения получать доступ к данным сайта. В этом случае содержимое полей ввода невозможно проверить простыми ограничительными границами и приложение сохраняет вредоносные входные данные. Это особенно относится к свободной форме текста или строковым типам данных. В таких ситуациях, содержание и значение входного поля должны быть проверены на предмет несанкционированного входа - наличие тегов или SQL команд. От SQL инъекции страдает не только база данных MySQL, но и любая база, поддерживающая языки запросов (а таких большинство) [6].
Для того, чтобы предотвратить SQL-инъекции, можно использовать функции языка PHP:
- Mod_rewrite. Структура предлагаемой информации имеет следующий вид - вместо ссылок вида index.php?id=1, например, используются ссылки вида html. Кроме защиты это придает более эстетический вид ссылок и более качественную индексацию сайта поисковыми системами. Реализация предлагаемого метода выглядит следующим образом в файл .htaccess вписываются строчки:
RewriteEngine on Options +FollowSymlinks RewriteBase
RewriteRule ^.htaccess$ - [F]
RewriteRule ^([0-9]*).html index.php?id=$1
Защита от SQL-инъекции происходит следующим образом: при вводе строки, например, http://сайт.ru/1′.html , mod_rewrite не пропустит этот запрос, так как выше упомянутая строка не удовлетворяет условию перенаправления.
- Следующим методом защиты от SQL-инъекций может быть предложена фильтрация данных, полученных от пользователя. Кроме «обычной» фильтрации данных, экранируются все опасные символы с помощью специальной функции: mysql_real_escape_string.
$data = mysql_real_escape_string ($data, $connect);
Где $data-переменная, хранящая какие-то данные, полученные от пользователя (данную операцию нужно проделать со всеми переменными, используемыми в SQL-запросах!), а $connect - подключение к базе MySQL (задаваемое функцией mysql_connect). Для того, чтобы эта защита работала, любые данные, передаваемые в SQL-запросе, необходимо оформлять одинарными кавычками:
mysql_query (”SELECT * FROM table WHERE id = ‘$id’”), вместо
mysql_query (”SELECT * FROM table WHERE id = $id”)
Выводы:
- Предлагается методика проверки корректности заполнения полей ввода на основе функций PHP.
- Предлагаются методы защиты от SQL-инъекций.
Литература
- http://www.beansoftware.com/ASP.NET-Tutorials/Validating-ASP.NET-2-0.aspx - Validating User Input In ASP.NET 2.0 Web
- http://www.devshed.com/c/a/PHP/Advanced-PHP-Form-Input-Validation-to-Check-User-Inputs/ - Advanc ed PHP Form Input Validation to Check User
- http://www.owasp.org/index.php/How_to_create_a_general_purpose_input_validation_system - How to create a general purpose input validation system.
- http://www.comptechdoc.org/independent/ programming/ programming-standards/input-validation.html - Input
- http://www.phpro.org/tutorials/Validating-User-Input.html - Validating user input in
- http://blog.theringing.net/zashhita-ot-sql-inekcii-s-pomoshhyu-mod_rewrite/ - Защита от SQL-инъекции с помощью mod_rewrite.