Языки программирования

Проверка корректности данных

Проверке корректности данных, вводимых пользователем необходимо уделять достаточно большое внимание, поскольку необработанные ошибки, возникающие при неправильном вводе данных, приводят к ошибкам в работе скрипта. Например, мы создаём форму для отправки пользователем письма, при этом адрес электронной почты необходимо вводить пользователю. В этом случае, для корректной работы программы мы должны сделать две вещи:
  • Проверить, что поле, в которое заносится электронный адрес непустое (поскольку пользователь может просто забыть ввести адрес, и, если этот случай необработан, возникнет ошибочная ситуация);
  • Проверить соответствие введенного адреса с помощью регулярного выражения.

Проверка на пустоту поля

Проверка того, что пользователь ввел данные, может осуществляться, с помощью функции isset:
<?php
  $name = $_POST['name'];
  if (!isset($name))
  {
    // если переменная $name не существует, просим повторить ввод имени
?>
    <h1>Пожалуйста введите ваше имя!</h1>
    <!-- далее следует HTML-код формы, в которой вводится имя -->
<?php
  }
  else
  {
    -
  }
?>
На практике удобно сначала проверить, не пустой ли action формы, а потом уже проверять различные его составляющие: поле имя, e-mail и т.д. К примеру:
<?php
  $action = $_POST["action"];
  if (!empty($action)) 
  {
    if (empty($name)) 
    {
     // код, для случая, когда не введено имя
    }
    if (empty($email))
    {
       // код, для случая, когда не введен e-mail
    }
  // дальнейший код скрипта
  }
  if (empty($action)) 
  {
?>
  <!-- здесь пишем HTML-код формы, в которой вводится информация -->
<?php
  }
?>

Проверка допустимости вводимых данных

Представим что нам надо проверить данные формы обратной связи. Как правило, такая проверка осуществляется при помощи регулярных выражений. Рассмотрим пример, в котором создается регулярное выражение для проверки адреса электронной почты.
Адрес должен иметь вид Walls.234@mail.ru. У адреса две составляющие — имя пользователя и имя домена, которые разделены знаком «@». В имени пользователя могут присутствовать буквы нижнего и верхнего регистров, цифры, знаки подчеркивания, минуса и точки.
Для проверки разделителя между именем пользователя и именем домена в выражение требуется добавить +@. Регулярное выражение, проверяющее имя пользователя и наличие разделителя имеет вид:
"/[0-9a-z_]+@[0-9a-z_^\.]"
Для проверки доменного имени добавляем выражение:
"\.[a-z]{2,3}/i"
Объединяя эти выражения, получаем регулярное выражение для проверки адресов электронной почты:
"/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"

Проверка файлов

Для файловых полей используются те же самые проверки, что и для обычных, однако они применяются уже не к собственно содержимому поля, а к массиву $_FILES, поэтому инструкции для файловых полей должны иметь специальную структуру. Рассмотрим в качестве примера следующую HTML-форму:
<form method="POST" enctype="multipart/form-data">
    ...
    <input type="file" name="photo">
    ...
</form>
Массив $_FILES для такой формы в случае успешной загрузки файла будет иметь такой вид:
Array
{
    [photo] => Array
        {
            [name] => britney 100x100.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php1AD.tmp
            [error] => 0
            [size] => 2752
        }

}
Чтобы сделать загрузку файла обязательной, в список инструкций нужно добавить элемент «*»:
'photo' => array{
        '*' => 'Нужно загрузить файл.',
        'name' => array{
                '/\.(jpeg|png)$/i' => 'Файл должен быть в формате JPEG или PNG.',
                // Для такой проверки можно было использовать и type 
                // принципиальной разницы нет, т.к. элемент type
                // генерируется сервером на основе расширения файла.
            },
        'size' => array{
                '< ' . (1024 * 1024) => 'Файл {*name*} слишком большой, максимум - 1 Мб.',
                // Метка {*name*} заменится на исходное имя загруженного файла  
            },
    }
Если проверка на загрузку как таковую является единственной, инструкцию для поля можно записывать в сокращенной форме:
'photo' => 'Нужно загрузить файл.'

Проверка изображений

Если предполагается загрузка изображения, можно выполнить ряд проверок некоторых его свойств, используя для этого специальный тип инструкций файлового поля. Это обычные инструкции, которые будут анализировать данные, полученные с помощью функции getimagesize(). В результате своей работы она возвращает массив следующего вида:
Array
{
    [0] => 450
    [1] => 675
    [2] => 2
    [3] => width="450" height="675"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
}
Предположим, нужно убедиться, что изображение нужного типа, и, кроме того, ограничить его максимальные размеры форматом 2048х1536. Чтобы выполнить все эти проверки, нужно включить в инструкции для файлового поля специальный элемент — «image»:
'photo' => array{
        'image' => array{
                '*' => 'Файл "{*name*}" не является изображением или поврежден.',
                'mime' => array{
                        '/jpeg|png/' => 'Изображение должно быть в формате JPEG или PNG.'
                        // Нужно сказать, что getimagesize() устанавливает mime-type файла
                        // на основе анализа его содержимого (определяется верно даже 
                        // при неправильном расширении), поэтому для проверки типа изображения 
                        // лучше использовать результат работы getimagesize(), 
                        // а не содержимое $_FILES.
                    },
                'width' => array{
                        '<= 2048' => 'Ширина изображения не должна превышать 2048 px.', 
                    },
                'height' => array{
                        '<= 1536' => 'Высота изображения не должна превышать 1536 px.',
                    },
            },
    }
Ключи «width» и «height» используются в качестве псевдонимов для ключей 0 и 1 исходного массива от getimagesize().

Вот именно с помощью таких проверок в php можно защитить от несанкцианированного доступа на Ваш сайт, а также от непонимающих и забывающих вводить нужные данные пользователей.
Самоучитель по PHP