Дезінфекція введення даних користувача - щасливе кодування

Ніколи не довіряйте нічому, що надходить від клієнта. - давнє прислів'я

Тепер ми знаємо, як отримати введення користувача за допомогою HTML-форм та запитів POST, які запускають функцію doPost () наших класів сервлетів.

Але ми повинні бути дуже обережними, показуючи це введення користувачами, особливо іншим користувачам. Ми не можемо просто дозволити довільний вміст, оскільки тоді зловмисні користувачі можуть робити погані речі, наприклад, вводити HTML або JavaScript на нашу сторінку, що дозволить їм перенаправляти браузери, красти інформацію або використовувати міжсайтові сценарії на вашому сайті.

Натомість ми мусимо санірувати дані, які ми отримуємо від наших користувачів, так що вони містять лише безпечний вміст. Не існує жодного найкращого способу зробити це! Це більше як серія питань, на які ви повинні відповісти, і відповіді залежать від того, як саме ви хочете, щоб ваш сайт діяв, і який тип контенту ви хочете дозволити.

Приклад веб-програми

Почнемо з прикладу веб-програми, яка отримує введення від користувача, а потім відображає їх. Ось наш клас сервлетів:

У своїй функції doGet () цей сервлет додає вміст до запиту та пересилає його у файл JSP для візуалізації. Функція doPost () отримує надісланий параметр вмісту, зберігає його, а потім перенаправляє назад на запит GET.

Файл JSP виглядає так:

Цей файл просто показує вміст, а потім форму, яка дозволяє користувачеві змінювати вміст.

Нарешті, ось файл web.xml:

Файл web.xml відображає URL-адресу/home на наш сервлет. Запустіть цей сервлет і відвідайте http: // localhost: 8080/home, і ви побачите це:

введення

Ви можете ввести якийсь текст, щоб переконатися, що він працює.

Ось я набрав Привіт світ! і натиснув кнопку Надіслати. Сервлет зберігав цей вміст, і тепер сторінка JSP відображає його. Ви можете сприймати це як дуже просту версію веб-сайту, що дозволяє надсилати дописи, як-от Twitter або Facebook або що завгодно.

Неправильний ввід користувача

Але що станеться, якщо ви введете html?

Спробуйте ввести щось на зразок

Це тому, що наш JSP просто виводить вміст безпосередньо в HTML у цьому рядку:

Тож якщо вміст є

Дозвіл користувачам вводити довільний HTML може спричинити проблеми на вашому сайті. Уявіть собі такий сайт, як Twitter, Facebook або Tumblr, де повідомлення одного користувача відображаються іншим користувачам. Якщо я зловмисний користувач, я міг би:

  • Запсуйте форматування вашого сайту.
  • Переспрямуйте веб-переглядачі вашого користувача на мій власний сайт.
  • Викрасти дані користувача.
  • Використовуйте сценарії між сайтами.

В якості іншого прикладу спробуйте ввести це як вміст:

Цей вміст - це просто світ!

Привіт badStuff () світ!

. Пам'ятайте, що і> відображаються як і>, а не аналізуються як теги HTML.

Чистий вміст, щоб дозволити лише безпечний HTML.

Газа вмісту, щоб взагалі не дозволяти HTML.

стає Hello world! .

Замінити вмісту, щоб користувачі могли вводити теги, які не є HTML, які ви перетворюєте в HTML. якийсь [b] жирний [/ b] вміст стає