Php і java script безпечні форми

Звичайно, перевірка даних, введених користувачем в форму і переданих PHP-скрипту безумовно повинна мати місце безпосередньо в самому PHP-скрипт, щоб користувач помилково не ввів некоректні дані, або не зробив цього навмисно для провокації помилки виконання скрипта. Але, давайте уявимо, що у нас сайт з дуже високою відвідуваністю, припустимо, 10000 візитів на добу і кожен користувач вводить дані в форму і відправляє її на сервер. Припустимо, 50% користувачів не заповнюють частину полів або заповнюють їх некоректно. Дані передаються скрипту, перевіряються, і форма повертається користувачеві для виправлення помилок. У нашому випадку, при великій кількості користувачів це створить зайве навантаження на сервер і зайвий трафік як для сервера, так і для користувачів.

Щоб уникнути зазначених вище проблем - доцільніше використовувати Java Script для перевірки коректності заповнення полів форми. За статистикою більше 95% користувачів для серфінгу по Інтернету користуються браузерами, що підтримують Java Script. Користувачів, що володіють старими версіями браузерів, або браузерами що не підтримують Java Script, або свідомо відключили Java Script за статистикою менше 5%.







Тепер будемо визначати правила, за якими будуть перевірятися окремі поля.

Ім'я відправника (sender) - не порожнє, не коротші, припустимо, 3-х символів, не довше 20.

p_sender = document.myform.sender.value.toString ();
if (p_sender! = "") if (p_sender.length<3 || p_sender.length>20) alert ( "Вкажіть ваше ім'я (3-20 символів)!");
document.myform.sender.focus ();
return false;
>
> Else alert ( "Необхідно ввести ім'я!");
document.myform.sender.focus ();
return false;
>

Номер аськи (icq) - якщо вказано, то складається тільки з цифр, не коротші 5 і не довше 9 знаків. Розмістимо частина ява-скрипта прямо в тезі поля для введення номера ICQ - таке обмеження дозволить користувачеві вводити в це поле тільки цифри

Далі необхідно перевірити довжину введеного номера

p_icq = document.myform.icq.value.toString ();
if (p_icq! = "") if (p_icq.length<5 || p_icq.length>9) alert ( "Довжина номера ICQ 5-9 символів!");
document.myform.icq.focus ();
return false;
>
>

Текст повідомлення (msg) - не порожнє і, припустимо, не менше 10 символів

p_msg = document.myform.msg.value.toString ();
if (p_msg.length <10) alert ("Необходимо ввести текст сообщения (не менее 10 символов) !");
document.myform.msg.focus ();
return false;
>

Тепер до полів обов'язковим для заповнення додаємо:

onkeypress = 'checkreq ()' onkeyup = 'checkreq ()' onblur = 'checkreq ()'


Тепер визначимо функцію checkreq ()

function checkreq () path = document.myform;
tmp = (path.sender.value == "");
if (! tmp (path.sender.value.length <3)) tmp = true;
path.Submit.disabled = tmp;
if (tmp) return;
tmp = (path.msg.value == "");
if (! tmp (path.msg.value.length <10)) tmp = true;
path.Submit.disabled = tmp;
>

Тепер "зберемо" окремі блоки, призначені для перевірки конкретних полів в одну функцію, а до форми додамо процедуру, яка буде викликати цю функцію перед відправкою форми PHP-скрипту.







Тепер при спробі користувача відправити форму PHP-скрипту, управління передається спочатку ява-скрипта, який повертає FALSE якщо буде знайдена хоч одна помилка користувача, курсор буде поміщений в поле, що містить помилку (перше за рахунком), і форма просто не буде відправлена.

Як було сказано вище, перевірка форми ява-скрипт дозволяє уникнути відправки невірно заповнених форм на сервер і тим самим знизити навантаження на сервер і трафік, але це не звільняє вас від необхідності жорсткої перевірки всіх даних, переданих користувачем, тому що користувач може навмисно відключити ява-скрипт у себе в браузері, щоб передати модифіковані дані.

Частина 2. Захист форм засобами PHP

До сих пір ми захищали PHP-скрипт від некоректних даних, переданих з форми. Але так само можна застосувати і засоби, запропоновані PHP, для захисту форм.

Напевно багатьом знайома проблема флуда (для цього зазвичай використовується проста програма, найчастіше написана на тому ж PHP). Думаю, вам буде не дуже приємно виявити в своїй гостьовій книзі пару тисяч повідомлень, часто образливого характеру? Найпростіший спосіб вирішення цієї проблеми - невелика картинка з кодом і поле для введення цього коду (як на великих поштових сервісах). Думаєте це дуже складно? Навпаки - це справа 5 хвилин. Отже, приступимо.

Лістинг файлу code.php, що генерує зображення з випадковим чісом

session_start ();
$ Сode = rand (100000,999999);
session_register ( "Сode");
$ Image = imageCreateFromPng ( "code.png");
$ Color = imageColorAllocate ($ Image, 254, 165, 65);
settype ($ Сode, "string");
imageString ($ Image, 3, 30, 3, $ Сode, $ Color);
Header ( "Content-type: image / png");
imagePng ($ Image);
imageDestroy ($ Image);

У файлі code.png у нас зберігатися чистий (або з необхідним фоном) PNG файл розмірами 100 на 20 пікселів. Випадкове шестизначне число записується в змінну $ code, зберігається в сесії, і накладається на картинку. Дану картинку можна вивести в браузер наступним чином

далі в форму додаємо поле, в яке користувач введе код

І далі, після відправки користувачем форми PHP-скрипту нам залишиться порівняти код зберігається, в сесії ($ HTTP_SESSION_VARS [ 'code']), з кодом, переданим користувачем ($ HTTP_POST_VARS [ 'code2']) і в разі розбіжності не брати дані форми і повернути її користувачеві. Таким чином, програма-флудер просто не зможе вважати код з картинки.

Ось власне і все. Тепер ваша форма буде більш надійною.