﻿
<h1 class=p1>Проверка корректности данных</h1>
<table border="0" cellspacing="10">
    <tr valign="top">
        <td>
            <a class=bluelink href="#1" title="Проверка на пустоту поля">isset()</a>&nbsp;<br>
            <a class=bluelink href="#2" title="Проверка на пустоту поля">empty()</a>&nbsp;<br>
        </td>
        <td>
            <a class=bluelink href="#3" title="Удаление обратных слешей">stripslashes()</a>&nbsp;<br>
        </td>
        <td>        
            <a class=bluelink href="#3" title="Удаление HTML-тегов">htmlspecialchars()</a>&nbsp;<br>
        </td>
    </tr>
</table>
<br>
<br>

<p class=text>Проверке корректности данных, вводимых пользователем необходимо уделять достаточно большое внимание, поскольку необработанные ошибки, возникающие при вводе неправильном вводе данных, приводят к ошибкам в работе скрипта, зачастую катастрофическим. Предположим, вы создаете форму для отправки пользователем письма, при этом адрес электронной почты необходимо вводить пользователю. В этом случае, для корректной работы программы вы должны сделать, по крайней мере, две вещи:</p>
<ul>
  <li>Проверить, что поле, в которое заносится электронный адрес непустое (поскольку пользователь может просто забыть ввести адрес, и, если этот случай необработан, возникнет ошибочная ситуация);</li>
  <li>Проверить соответствие введенного адреса с помощью регулярного выражения.</li>
</ul>
<p class=text>Кроме чистых ошибок пользователя, необходимо также исключить ситуации, в которых возможно злонамеренное введение некорректных данных, к примеру, различных скриптов. Для этого вводимый пользователем текст необходимо обработать функциями удаления HTML-тегов (для исключения возможности написания скриптов на JavaScript и Visual Basic) и обратных слешей (для исключения возможности написания скриптов на Perl). Т. о. минимальный набор действий, необходимый для проверки корректности данных, вводимых пользователем, включает следующие этапы:</p>
<ul>
  <li>проверка того, что пользователь ввел данные</li>
  <li>проверка допустимости вводимых пользователем данных (как правило, осуществляется при помощи регулярных выражений)</li>
  <li>обработка текста, введенного пользователем функцией htmlspecialchars для удаления HTML-тегов</li>
  <li>обработка текста, введенного пользователем функцией stripslashes для удаления обратных слешей</li>
</ul>
<h2 class=p1>Проверка на пустоту поля</h2>
<a name=1></a>
<p class=text>Проверка того, что пользователь ввел данные, может осуществляться, к примеру, с помощью функции <b>isset</b>:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$name</b><em class=gr> = </em><b>$HTTP_POST_VARS</b>['name']<em class=gr>;
  if (</em><b>!isset</b><em class=gr>(</em><b>$name</b><em class=gr>))
  {</em><em class=comnt>
    // если переменная $name не существует просим повторить ввод имени</em>
<em class=red>?&gt;</em>
    &lt;h1&gt; Вы забыли ввести ваше имя &lt;/h1&gt;<em class=comnt>
    &lt;!-- далее следует HTML-код формы, в которой вводится имя --&gt;</em>
<em class=red>&lt;?</em><em class=gr>
  }
  else
  {</em>
    -<em class=gr>
  }</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<a name=2></a>
<p class=text>Для этой же цели можно использовать функцию <b>empty</b>:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$name</b><em class=gr> = </em><b>$HTTP_POST_VARS</b>['name']<em class=gr>;
  if (</em><b>empty</b><em class=gr>(</em><b>$name</b><em class=gr>))
  {</em><em class=comnt>
    // если поле пустое, снова просим ввести имя</em>
<em class=red>?&gt;</em>
    &lt;h1&gt; Вы забыли ввести ваше имя &lt;h1&gt;<em class=comnt>
    &lt;!-- далее следует HTML-код формы, в которой вводится имя --&gt;</em>
<em class=red>&lt;?</em><em class=gr>
  }
  else
  {</em>
    -<em class=gr>
  }</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>На практике удобно сначала проверить, не пустой ли action формы, а потом уже проверять различные его составляющие: поле имя, e-mail и т. д. К примеру:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$action</b><em class=gr> = </em><b>$HTTP_POST_VARS</b>["action"]<em class=gr>;
  if (</em><b>!empty</b><em class=gr>(</em><b>$action</b><em class=gr>)) 
  {
    if (</em><b>empty</b><em class=gr>(</em><b>$name</b><em class=gr>)) 
    {</em><em class=comnt>
     // код, для случая, когда не введено имя</em><em class=gr>
    }
    if (</em><b>!empty</b><em class=gr>(</em><b>$email</b><em class=gr>))
    {</em><em class=comnt>
       // код, для случая, когда не введен e-mail</em><em class=gr>
    }</em><em class=comnt>
  // дальнейший код скрипта</em><em class=gr>
  }
  if (</em><b>empty</b><em class=gr>(</em><b>$action</b><em class=gr>)) 
  {</em>
<em class=red>?&gt;</em><em class=comnt>
  &lt;!-- здесь пишем HTML-код формы, в которой вводится информация --&gt;</em>
<em class=red>&lt;?</em><em class=gr>
  }</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<h2 class=p1>Проверка допустимости вводимых данных</h2>
<p class=text>Пусть нам надо проверить данные формы для отправки сообщения гостевой книги. Как правило, такая проверка осуществляется при помощи регулярных выражений. Рассмотрим пример, в котором создается регулярное выражение для проверки адреса электронной почты.</p>
<p class=text>Будем исходить из того, что адрес должен иметь вид something@server.com. Как видим, у адреса две составляющие - имя пользователя и имя домена, которые разделены знаком @. В имени пользователя могут присутствовать буквы нижнего и верхнего регистров, цифры, знаки подчеркивания и минуса, точки. Для проверки разделителя между именем пользователя и именем домена в выражение требуется добавить +@. Таким образом, регулярное выражение, проверяющее имя пользователя и наличие разделителя имеет следующий вид:</p>
<blockquote><pre>
  "/[0-9a-z_]+@[0-9a-z_^\.]"
</pre></blockquote>
<p class=text>Для проверки доменного имени добавляем такое выражение:</p>
<blockquote><pre>
  "\.[a-z]{2,3}/i"
</pre></blockquote>
<p class=text>Объединяя эти шаги, получаем следующее регулярное выражение для проверки адресов электронной почты:</p>
<blockquote><pre>
  "/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"
</pre></blockquote>
<p class=text>Точно таким же образом вы можете проверить и остальные заполняемые пользователем поля.</p>
<a name=3></a>
<h2 class=p1>Удаление HTML - тегов и обратных слешей</h2>
<p class=text>Как уже говорилось, вводимый пользователем текст необходимо обработать функциями удаления HTML-тегов (для исключения возможности написания скриптов на JavaScript и Visual Basic) и обратных слешей (для исключения возможности написания скриптов на Perl). К примеру, если переменная <b>$name</b> содержит текст с именем пользователя, то обработка этого текста выглядит так:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$name</b><em class=gr> = </em><b>substr</b><em class=gr>(</em><b>$HTTP_POST_VARS</b>["name"],0,32<em class=gr>);</em>
  <b>$name</b><em class=gr> = </em><b>htmlspecialchars</b><em class=gr>(</em><b>stripslashes</b><em class=gr>(</em><b>$name</b><em class=gr>));</em>
<em class=red>?&gt;</em>
</pre></blockquote>
