Page 92 - 4636
P. 92
запит за допомогою методів mysqli_query або mysqli:: запит. Для виконання декількох
запитів слід скористатися методами mysqli_multi_query або mysqli: :multi_query, які
запобігають виконання зайвих і потенційно шкідливих операторів або запитів.
Літералізація вихідних даних
Крім фільтрації вхідних даних, не менш важливо і літералізувати вихідні дані. Коли значення,
введені користувачем, є в системі, важливо, щоб вони не змогли завдати якої-небудь шкоди або
ненавмисні дії. Це можна забезпечити за допомогою пари функцій, які перевіряють, що подібні
значення будуть виступати в клієнтському веб-браузері як текст. Існують такі програми, де в принципі
можна було б взяти дані, введені користувачем, і вивести їх на який-небудь сторінці. Чудовими
прикладами таких ситуацій можуть служити користувальницькі коментарі до опублікованої статті або
електронні дошки оголошень. У таких випадках необхідно стежити, щоб користувачі не змогли
вставити у текст, який вводиться, шкідливу HTML-розмітку. Один з найбільш легких способів зробити
це полягає в застосуванні функції htmlspecialchars або htmlentities. Ці функції
перетворюють певні символи у вхідному рядку в символьні підстановки HTML. Символьні
підстановки - це спеціальні послідовності символів, які починаються з символу амперсанда (&) і
позначають спеціальні символи, які важко вставити в HTML-код не-посередньо. Після символу
амперсанда знаходиться ім'я підстановки, а потім крапка з комою (;). Символьна підстановка може
мати й інший вигляд: десятковий ASCII - код символу з символом # - наприклад, / замість
символу прямого слеша (/). Наприклад, всі елементи розмітки HTML позначені символами <і >, і
тому їх важко ввести в виведений контент (оскільки браузер за замовчуванням вважає, що в кутових
дужках містяться дескриптори). Щоб не плутати браузер, можна використати підстановки < і>.
Аналогічно, для включення в HTML-код символу амперсанда призначена підстановка &аmр;.
Одиночні та подвійні лапки подаються відповідно як ' і ". Символьні підстановки
перетворюються в HTML - клієнтом (тобто веб-браузером) і тому не вважаються частиною розмітки.
Відмінність між функціями htmlspecialchars або htmlentities полягає в тому, що перша з
них за замовчуванням замінює тільки символи &, <і> і, можливо, одиночні і подвійні лапки. У
htmlentities замінює все, для чого існують іменовані підстановки. Прикладами таких символів
можуть служити символи авторського права © (представляється як і &сору;) і символ грошової
одиниці євро (представляється як €). Однак ця функція не перетворює символи в їх числові
підстановки. Обидві функції приймають другий аргумент, який вказує, перетворювати в підстановки
одиночні та подвійні лапки, а також третій аргумент - набір символів, який слід перетворити вхідний
рядок (це дуже важливо для нас, оскільки нам потрібно працювати з кодуванням UTF-8). Можливі
значення другого параметра:
ENT_COMPAT - подвійні лапки замінюються на ", а поодинокі залишаються без зміни;
ENT_QUOTES - одиночні та подвійні лапки замінюються відповідно на' і "
ENT_NOQUOTES (за замовчуванням) - одиночні та подвійні лапки залишаються без зміни.
Розглянемо такий текст:
$input_str = "<р align=\"center\">Користувач дав нам
\"15000€\".</р><script type=\"text/javascript\">// Шкідливий
JavaScript-код.</script>";
Тепер опрацюємо його наступним РНР-сценарієм (тут застосовується функція nl2br, щоб
забезпечити акуратне форматування в браузері):
<?php$str=htmlspecialchars($input_str, ENT_NOQUOTES, "UTF-8");
echon12br($str);$str = htmlentities($input_str, ENT_QUOTES, "UTF-
8");ехо nl2br($str);??>
Тоді ми отримаємо такий текстовий результат:
89