Page 91 - 4636
P. 91

break;
           }?>
              Даний  код  більший  за  обсягом  але,  принаймні,  ми  впевнені,  що  оброблюються  правильні
        значення.  Це  значно  важливіше,  якщо  обробляти  дані,  більш  близькі  до  фінансів,  ніж  стать
        користувача.  Так  що  можна  навіть  бути  впевненим,  що  значення,  отримане  з  форми,  належить
        очікуваній більшості - його обовязково треба перевіряти.
              Фільтрація  навіть  найпростіших  значень.  Елементи  HTML-форми  не  належать  до  жодного
        типу і просто передають серверу рядки (які, щоправда, можуть містити дати позначки або числа).Так
        що якщо у формі є числове поле, то не варто припускати чи сподіватися, що в нього дійсно введено
        число.  Навіть  якщо  середовище  містить  потужний  клієнтський  код,  який  перевіряє,  що  введене
        значення  необхідного  типу,  все  одно  немає  гарантії,  що  це  значення  безпосередньо  передається  на
        сервер.  Є  простий  спосіб  перевірити,  що  значення  має  потрібний  тип.  Потрібно  привести  або
        перетворити його в цей тип, а потім використовувати це значення, наприклад:
              $number_of_nights = (int) $_POST['num_nights'];
              if ($number_of_nights - 0) {
              echo "ПОМИЛКА: Неправильна кількість заброньованих ночей!";
              exit;}
              Якщо користувач повинен ввести дату в якомусь національному форматі - наприклад, ММ/ДД/РР
        для  США  -  то  можна  написати  код  перевірки,  що  це  дійсно  дата,  наприклад,  за  допомогою  PHP-
        функції  checkdate.  Ця  функція  набуває  значення  місяця,  дня  і  (4-значний)  року  і  перевіряє,  чи
        складають вони всі разом допустиму дату:
           // Розділення дати на компоненти
           $mmddyy = split ($_P0ST[ 'departure_date' ],’/’);
           if (count($mmddyy) != 3) {
           echo "ПОМИЛКА: Вказана невірна дата!";
           exit;}// Обробка значень року  02 або 95
           if ((int)$mmddyy[2] < 100) {
           if ( (int) $nunddyy [2] > 50)$mmddyy[2] = (int)$mmddyy[2] + 1900;
           elseif ((int)$mmddyy[2] >= 0}$mmddyy[2] = (int)$mmddyy[2] + 2000;//
           інакше рік < 0, і checkdate виявить це}if (!checkdate($mmddyy[0],
           $mmddyy[l], $mmddyy[2])){
           echo "ПОМИЛКА: Вказана невірна дата!";
           exit;}
           Витративши  час  на  фільтрацію  та  перевірку  вхідних  даних,  ви  не  тільки  забезпечите  природну
        попередню верифікацію (наприклад, що дата вильоту правильна), але і підвищить безпеку системи.
              Безпека рядків для SQL. Ще одна область, де необхідна обробка введених рядків, щоб зробити
        їх  безпечними  -  це  захист  від  атак  впровадженням  SQL-коду,  які  вже  згадувалися,  коли  ми  тільки
        почали  розглядати  застосування  MySQL  в  РНР.  У  цих  атаках  зловмисник  намагається
        використовувати слабо захищений код і користувальницькі повноваження, щоб виконати додатковий
        SQL-код, який потрібен йому, але не нам. І якщо розслабитися, то можна пропустити ім'я користувача
        зразок: kitty_cat; DELETE FROM users;яке може завдати чимало клопоту.
           Для захисту від таких атак існують два основних способи:
               фільтрація  і  літерализация  всіх  рядків,  що  посилаються  на  сервери  баз  даних,  за  допомогою
        SQL.         Для          цього         застосовують          функції         mysql_escape_string,
        mysqli::real_escape_string або mysqli_real_escape_string;
               перевірка, що всі вхідні дані мають очікуваний вигляд. Якщо імена користувачів повинні мати
        довжину до 50 символів і містити тільки літери та цифри, то напевно в кінці імені не повинен бути
        рядок DELETE FROM users; ". Наявність РНР-коду для перевірки, що вхідні дані містять допустимі
        значення,  перш  ніж  посилати  їх  на  сервер  баз  даних,  означає,  що  можна  виводити  набагато  більш
        осмислені  повідомлення  про  помилки,  ніж  це  зробить  СУБД  (під  час  перевірки)  і  знизити  ризик
        компрометації. У розширенні mysqli є додаткове посилення захисту, яке дозволяє виконати єдиний
                                                            88
   86   87   88   89   90   91   92   93   94   95   96