Мартін-Науман/історія: 2958270

Документ документа = Jsoup. синтаксичний розбір (param);
док. outputSettings (). escapeMode (EscapeMode. xhtml);
Рядок очищений = doc. тіло (). текст ();

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

підробленого

Рафаель Гюрцелер прокоментував 20 червня 2012 р

Отже, щоб правильно очистити вхідні дані, потрібно:

Документ брудний = Jsoup.parseBodyFragment (bodyHtml);
dirty.outputSettings (). escapeMode (EscapeMode.xhtml);
Документ чистий = новий очищувач (білий список) .clean (брудний);
Рядок очищений = clean.body (). Html ();

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Це найчистіший спосіб, так.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Зачекайте: я не бачив, щоб ви використовували "html ()" в останньому рядку - не робіть цього. Використовуйте "text ()" - html для введення, яке абсолютно призначене для вмісту HTML. Я думаю, у більшості випадків ми взагалі не хочемо мати HTML у вхідних даних, правильно?

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

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

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

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

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

хм ну, диявол може бути в деталях - це має бути нормально для більшості випадків у моїй заявці. Однак є кілька випадків, коли параметр записується у змінну javascript безпосередньо в jsp - у цих випадках вам не потрібен html, маніпулюючи рядком, ви можете отримати код javascript для виконання таким чином - моя перша думка була окремими методами (один суворий, розслаблений) у кожному конкретному випадку, але це, в кращому випадку, невдале рішення. Це цілком можливо, що я отримую змінну, яка була б введена за допомогою розслабленого методу в налаштуваннях, де вона вимагала б жорсткої фільтрації. У мене є кілька ідей, але спочатку доведеться зробити кілька тестів.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

Для ілюстрації - можна досягти чогось такого (у коді javascript) із запропонованим рішенням:
var status = "; alert ('xss'); var xyz = ";

Оригінальний код сторінки:
статус статусу = ";

І зловмисний запит:
?статус =% 22; попередження (% 27xss% 27);% 20var% 20xyz% 20 =% 20% 22

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Звичайно, ви повинні знати, в якому контексті ви перебуваєте.

У контексті Javascript-Context (який також застосовується, коли ви пишете щось у HTML-атрибутах як "onclick" або "onmouseover" та ін.), Ви повинні використовувати зовсім іншу стратегію. Допис у блозі, на який я вчора посилався у FB, детально розповідає про це.
Є ще одна стаття, яку придумав Ніколас, де описується, чому не існує дієвого "єдиного рішення" для уникнення в різних контекстах. Ви завжди повинні бути впевнені, що зроблено правильний екран для поточного контексту.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

що повертає мене до моєї початкової пропозиції щодо проблем із заголовком на вихідному етапі - суть усього цього вправи полягала в тому, щоб знайти спосіб вирішити це на початковому етапі;-). тому я думаю, що це повернулося до дошки для малювання - в основному мені тоді потрібно принаймні 3 процесора - один для текстових виходів у html, один для текстових виходів у javascript (вбудований у jsps), а другий для текстових виходів через код javascript (присвоєння значень з json до існуючі елементи на сторінці)

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Я запропонував рішення лише в контексті HTML.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

так, вибачте, я повинен був бути точнішим у тому, чого я намагався досягти, принаймні я зараз розумію, чому ти надувався по UTF-8 (і чому я був здивований цим) - у мене ніколи не було проблем з виведенням у html контексті, мої проблеми виникли лише в 2 контексті javascript, який я описав.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

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

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Це дві різні проблеми: я шукав у правильному напрямку, коли ви скаржилися на кодування Умлаутів. Це - проблема кодування, яку можна обійти, використовуючи метод, який я запропонував тут.
Потім проблема з екрануванням у контексті JS, яка не пов’язана з перекладом умлаутів на сутності (і т. Д.) - цього разу проблема полягає в тому, що JSoup забезпечує екранування для неправильного контексту.
Цікаво, чи може цей ESApi-Thingy мати методи для усіх можливих контекстів.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Щоб бути зрозумілим: я помилився з тим, що Jsoup відгадав неправильну кодировку, але врешті-решт нам довелося сказати Jsoup використовувати кодировку за замовчуванням для XHTML (а це UTF-8), щоб зупинити її від непотрібних і небажаних додаткових кодувань для "спеціального символи "як умлаути.

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

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

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Для JS-контексту ми могли б використовувати Java.Net.URLEncoder у поєднанні з HTML-Escaping через Jsoup як перший підхід. АЛЕ: Я не впевнений на 100%, якщо цього достатньо. Я надам свої результати, коли я закінчу досліджувати цей біт

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Мартін-Науман прокоментував 20 червня 2012 р

Наступне рішення працює надзвичайно добре:

Цей коментар зведено до мінімуму.

Копіювати посилання Цитувати відповідь

Рафаель Гюрцелер прокоментував 20 червня 2012 р

Поки що підхід вхідної фільтрації всіх html (але залишаючи umlauts недоторканими) і проведення суворої фільтрації вихідних даних для тих небагатьох випадків, коли це потрібно, здається, працює - тепер мені просто потрібно переконатися, що немає нових небажаних побічних ефектів, і переконатися що насправді жодна атака з таблиці коду XSS не проходить (ті кілька, які я намагався до цього часу, всі були належним чином врятовані)