стій!
Ви тут помиляєтесь. О, ні, ви вибрали правильні функції PHP, щоб зробити ваші дані трохи безпечнішими. Добре. Ваша помилка - в порядку операцій , а також як і де використовувати ці функції.
Важливо зрозуміти різницю між санітизацією та валідацією даних користувачів, вилученням даних для зберігання та видачею даних для презентації.
Санітація та перевірка даних користувачів
Коли користувачі подають дані, вам потрібно переконатися, що вони надали те, що ви очікуєте.
Санітація та фільтрування
Наприклад, якщо ви очікуєте номер, переконайтеся, що подані дані є числом . Ви також можете передавати дані користувачів іншим типам. Все подане спочатку трактується як рядок, тому примушення відомого числових даних перетворюватися на ціле число або плавець робить санітарію швидкою і безболісною.
Що з текстовими полями та текстовими областями у вільній формі? Вам потрібно переконатися, що в цих полях немає нічого несподіваного. Головним чином, ви повинні переконатися, що поля, які не мають вмісту HTML, насправді не містять HTML. Є два способи вирішити цю проблему.
По-перше, ви можете спробувати уникнути введення HTML за допомогою htmlspecialchars
. Не слід використовувати htmlentities
для нейтралізації HTML, оскільки він також виконуватиме кодування акцентованих та інших символів, які, на його думку, також потребують кодування.
По-друге, ви можете спробувати видалити будь-який можливий HTML. strip_tags
швидко і легко, але також неохайно. HTML очищувач виконує набагато більш ретельну роботу, як знімати весь HTML, так і дозволяючи вибірковий білий список тегів та атрибутів.
Сучасні версії PHP поставляються з розширенням фільтра , що забезпечує всебічний спосіб очищення введення користувача.
Перевірка
Переконатися, що подані дані не містять несподіваного вмісту - це лише половина роботи. Вам також потрібно спробувати переконатися, що подані дані містять значення, з якими ви можете реально працювати.
Якщо ви очікуєте числа від 1 до 10, вам потрібно перевірити це значення. Якщо ви використовуєте один з цих нових фантазійних числових входів епохи HTML5 із спінером та кроками, переконайтесь, що подані дані відповідають кроку.
Якщо ці дані надходили зі спадного меню, переконайтеся, що подане значення є таким, яке з’явилося в меню.
Що з текстовими вводами, які відповідають іншим потребам? Наприклад, дати введення повинні бути перевірені через strtotime
або клас DateTime . Дана дата повинна бути між очікуваними діапазонами. Що з адресами електронної пошти? Раніше згадане розширення фільтра може перевірити, чи адреса добре сформована, хоча я фанат бібліотеки is_email .
Те саме стосується всіх інших елементів управління. У вас є кнопки радіо? Підтвердити список. У вас є прапорці? Підтвердити список. Завантажити файл? Переконайтеся, що файл очікуваного типу, і обробіть ім’я файлу як нефільтровані дані користувача.
Кожен сучасний веб-переглядач оснащений повним набором інструментів для розробників, вбудованих прямо, завдяки чому кожен може маніпулювати вашою формою. Ваш код повинен припускати, що користувач повністю зняв усі обмеження щодо вмісту форми на стороні клієнта !
Уникнення даних для зберігання
Тепер, коли ви переконалися, що ваші дані є у очікуваному форматі та містять лише очікувані значення, вам потрібно потурбуватися про збереження цих даних для зберігання.
Кожен окремий механізм зберігання даних має певний спосіб переконатися, що дані належним чином виконуються та кодуються. Якщо ви будуєте SQL, то прийнятим способом передачі даних у запитах є підготовка заяв із заповненнями .
Одним з кращих способів роботи з більшістю баз даних SQL в PHP є розширення PDO . З цього випливає загальна схема підготовки оператора , прив'язування змінних до оператора , потім відправлення оператора та змінних на сервер . Якщо ви раніше не працювали з PDO, ось непоганий навчальний посібник, орієнтований на MySQL .
Деякі бази даних SQL мають власні розширення спеціальностей у PHP, включаючи SQL Server , PostgreSQL та SQLite 3 . Кожне з цих розширень підготувало підтримку операторів, яка працює так само, як і PDO. Іноді вам може знадобитися використовувати ці розширення замість PDO для підтримки нестандартних функцій чи поведінки.
MySQL також має власні розширення PHP. Два з них, насправді. Ви хочете коли-небудь використовувати той, який називається mysqli . Старе розширення "mysql" було застарілим і не є безпечним або розумним для використання в сучасну епоху.
Я особисто не шанувальник mysqli. Те, як воно виконує змінну прив'язку підготовлених висловлювань, є негнучким і може бути болючим у використанні. Якщо ви сумніваєтесь, замість цього використовуйте PDO.
Якщо ви не використовуєте базу даних SQL для зберігання даних, перегляньте документацію інтерфейсу бази даних, який ви використовуєте, щоб визначити, як безпечно передавати дані через них.
Коли це можливо, переконайтеся, що ваша база даних зберігає ваші дані у відповідному форматі. Зберігати номери в числових полях. Зберігати дати в полях дат. Зберігайте гроші в десятковому полі, а не в полі з плаваючою комою. Перегляньте документацію, надану вашою базою даних щодо правильного зберігання різних типів даних.
Дані для виходу з презентації
Кожен раз, коли ви показуєте дані користувачам, ви повинні переконатися, що дані надійно захищені, якщо ви не знаєте, що їх не слід уникати.
Випромінюючи HTML, ви майже завжди повинні передавати будь-які дані, які були спочатку надані користувачем htmlspecialchars
. Насправді, єдиний раз, коли ви цього не повинні робити, це коли ви знаєте, що користувач надав HTML, і знаєте, що це вже було дезінфіковано за допомогою білого списку.
Іноді вам потрібно створити трохи Javascript за допомогою PHP. У Javascript немає таких самих правил, що і у HTML! Безпечний спосіб надати користувачеві значення Javascript через PHP json_encode
.
І більше
Існує ще багато нюансів перевірки даних.
Наприклад, кодування набору символів може бути величезною пасткою . Ваша заявка повинна слідувати практиці, викладеній у " UTF-8, до кінця ". Існують гіпотетичні атаки, які можуть виникати, коли ви розглядаєте рядкові дані як неправильний набір символів.
Раніше я згадав інструменти для налагодження браузера. Ці інструменти також можуть використовуватися для маніпулювання даними cookie. Файли cookie слід розглядати як ненадійне введення користувача .
Перевірка даних та її вихід - лише один із аспектів безпеки веб-додатків. Ви повинні ознайомитись з методологіями атаки веб-додатків, щоб ви могли створити захист проти них.