Предыдущий пост в блоге о MySQL и PostgreSQL вызвал дискуссию о проверке входных данных в веб-приложении, управляемом базой данных.
В этой статье я попытаюсь объяснить, что такое проверка и почему она важна.
Я помню, как мне преподавали важность проверки входных данных еще в старших классах по факультативному предмету. Нас учили, что все вводимые пользователем данные должны быть проверены до того, как на них действовать. На этом этапе мы «программировали» в Microsoft Excel с использованием VBscript, но валидация тем более актуальна для веб-приложений, которые могут использоваться — или использоваться — широким кругом людей.
Проверка данных — это процесс проверки пользовательского ввода, чтобы увидеть, находится ли он в ожидаемом формате и находится в диапазоне допустимых значений для этого ввода. У этого есть много целей, некоторые из которых ниже.
- Если пользователь отправляет данные, которые находятся за пределами допустимых значений или имеют неправильный формат, это может привести к непредвиденному поведению приложения, которое может включать пустой экран или экран, который не имеет смысла. Проверка позволяет предотвратить это и вместо этого представить пользователю удобочитаемое сообщение об ошибке. Позволение пользователю увидеть, почему ввод не был принят, значительно облегчает юзабилити приложения.
- Злонамеренный пользователь приложения может попытаться использовать проблемы в приложении, отправляя данные не в том формате, который ожидает приложение, или вне диапазона значений, которые должен использовать пользователь. Используемое значение, если не отмечено, может предоставить пользователю доступ к некоторому аспекту приложения, скрытому в противном случае, из-за внутренней проблемы в приложении.
- Проверка данных может помочь гарантировать, что сохраненные данные полны и что ничего не пропало. Например, гарантируя, что «обязательные» поля действительно заполнены пользователем, гарантируется, что в записи базы данных не будет пробелов (или пустых строк), что может привести к проблемам с неполными данными, к которым позже будут применены, например, к связаться с клиентом.
Итак, валидация имеет много разных целей.
Вот несколько примеров проверки, которую вы, возможно, захотите применить к вводу от ваших пользователей.
Строки:
- Убедитесь, что строка имеет допустимую длину.
- Убедитесь, что строка содержит символы в определенном диапазоне.
- Если строка ‘обязательна’, убедитесь, что она не пустая.
Числовые значения:
- Убедитесь, что значение на самом деле является числовым и не является произвольной строкой.
- Если значение должно быть целым числом (целое число), убедитесь, что это так.
- Убедитесь, что значение находится между максимально допустимым значением и минимально допустимым значением.
- Если есть некоторые значения, которые не разрешены (например, ноль), убедитесь, что это не одно из этих значений.
Логические (true / false) значения:
- Убедитесь, что значение равно false или true (или 0 или 1).
Перечисленные (выбранные) значения:
- Убедитесь, что значение точно равно одному из разрешенных вариантов.
Существуют некоторые обстоятельства, когда простой проверки, чтобы увидеть, является ли строка правильной длины или содержит разрешенные символы, недостаточно, и для этого можно использовать регулярные выражения , чтобы убедиться, что строка соответствует заданному формату или шаблону .
В моих личных проектах я использую вспомогательный класс для простой проверки правильности ввода. Метод load_var этого класса загружает значение из входной переменной и проверяет его по заданному шаблону. Если ввод неверен, метод возвращает ноль .
$username = $context->load_var('username', 'POST', 'name');
if ($username === null)
{
// report an error
}
Иногда я использую библиотеку PHP для создания и обработки веб-форм, например, библиотеку, которую мы используем в SitePoint (ласково называемую RapidAdmin), или HTML_Quickform от PEAR, или мою собственную библиотеку. Такая библиотека обычно может проверить ваши данные для вас. Например, HTML_Quickform способен проверять данные в соответствии с шаблонами, указанными при создании формы. Если какое-либо поле формы не заполнено правильно, HTML_Quickform позволит вам показывать пользователю сообщение об ошибке, а не передавать недопустимые значения поля в ваше приложение.
Как упоминалось в комментариях к последнему сообщению, серверы баз данных, такие как MySQL и PostgreSQL, также выполняют проверку данных, чтобы гарантировать, что вводимые значения не вызовут проблем при вставке их в таблицы базы данных. Эта проверка данных предназначена для базы данных, а не для вашего приложения (PHP), поэтому она не заменяет вашу собственную проверку. Кроме того, как указал Саймон, MySQL иногда молча усекает или преобразует данные без их проверки, что может привести к неожиданному поведению без сообщения об ошибке, объясняющего это.
Поэтому вы всегда должны проверять данные перед их передачей на сервер базы данных. Это дает вашему приложению возможность корректно решить проблему, возвращая пользователю удобочитаемое и понятное сообщение об ошибке. Конечный пользователь не хочет сталкиваться с ошибкой запроса к базе данных, поскольку пользователь даже не написал запрос.