Питання Чи існує остаточна анти-XSS-бібліотека для PHP?


Я вже знаю, як працює XSS, але виявлення всіх різних способів введення вразливого вводу не є варіантом.

Я бачив бібліотеки пари там, але більшість з них є дуже неповними, неефективними або ліцензованими GPL (коли ви, хлопці, дізнаєтеся, що GPL не добре поділитися маленькими бібліотеками! Використовуйте MIT)


19
2017-10-20 02:03


походження


Може бути, ви могли б перерахувати бібліотеки, які ви вже розглядали, тому ми не витрачаємо наш час на всі ці неповні, неефективні або неналежним чином ліцензовані рішення? - grossvogel
Використання бібліотеки допоможе вирішити багато проблем із XSS. Якщо ваша заявка складна, вона не отримає їх усіх. Якщо ваша заявка є цільовою ціллю, хтось зрештою зламає його. Ви абсолютно повинні дізнатись, як XSS працює і розуміє її у деталях, щоб написати захищену програму. Навіть якщо ви використовуєте бібліотеку. - Paul McMillan
Всі бібліотеки "anti-XSS" є неповними за своїм характером, оскільки вони намагаються застосувати евристику, щоб з'ясувати, який вхід може бути шкідливим при неправильній обробці на виході, але працює на вхідній стадії, не маючи уявлення про те, з чого випливає вихідний етап . Хоча існує компроміс між тим, наскільки очевидно, що експлойт, який ви пропустили (хибно-негативний) і наскільки погано ви руйнуєте реальний користувацький ввід (помилково-позитивний), у вас завжди буде "помилково", оскільки завдання за своєю суттю неможлива. Anti-XSS є абсолютно фальшивим. Ви повинні виправити ваш вихід для кодування, якщо це необхідно для контексту. - bobince
+1 для коментаря Бобінса - alex
Бібліотека Я думаю, ви маєте на увазі виклик функції. - rook


Відповіді:


OWASP пропонує кодування бібліотеку, на який час був витрачений для обробки різних випадків.

Застарілі: http://www.owasp.org/index.php/Category:OWASP_Encoding_Project

Зараз на http://code.google.com/p/reform/ 
 і бібліотека antiXSS OWASP належить до: http://code.google.com/p/php-antixss/


17
2017-10-20 02:19



Це виглядає чудово, і MIT має ліцензію. Чудово! - HappyDeveloper
Видається, що цей код не оновлювався з 2007 року. Це проблема? - james.garriss


htmlspecialchars() єдина функція, про яку ви повинні знати.


7
2017-10-20 02:06



+1 Кодування вашого виводу. Це дійсно так просто. - meagar♦
На жаль, цього недостатньо. Якщо ви кодуєте html символи, що використовуються в JavaScript, у вашому JS з'являться погані дані. Те саме для символів, розміщених у URL-адресах. Також існують випадки використання, коли функція не завадить XSS, наприклад, атрибути тегів без інкапсуляції одно- або подвійних лапок (оскільки пробіл не кодується htmlspecialchars) - atk
@zerkms: IIRC, JS вимагає \ xx, де xx - шестигранний код байта. URL-адреси вимагають% xx, знову ж таки xx є hex. Хорошим прикладом JS з погано закодованими даними буде попередження ("& amp;"), а хорошим прикладом URL-адрес буде www.example.com/foo?a=b&c=d У першому випадку, якщо ви хочете сповіщення про символ амперсанд, ви будете попереджати про строку & amp; У другому випадку ви матимете CGI args з a = b і amp; c = d (припускаючи; не розглядається як спеціальний символ в схемі URL - я не пам'ятаю, якщо це чи ні, від вершини з моєї голови) Правда, у вас не буде XSS, але ваша функціональність також не спрацює. - atk
Звичайно, вам потрібна правильна форма кодування для вашого вихідного контексту. Це найчастіше htmlspecialchars() для HTML, але може бути rawurlencode(), json_encode(), mysql_real_escape_string(), що завгодно Головне, це залежить від вихідного етапу і є ні щось, що можна обробляти на вході, використовуючи "анти-XSS" заходи. - bobince
@rjmunro: подвійні лапки вже закодовані за замовчуванням. Що за ENT_QUOTES Прапорець також має кодувати одиночні лапки, які також можна використовувати як розмежувачі значень атрибутів (хоча насправді це мало). Це безпечніше робити, але це насправді не потрібно, якщо ви не отримали атрибути, що котируються окремо. - bobince


HTMLPurifier - це незаперечний найкращий варіант для очищення введення HTML, а htmlspecialchars слід застосувати до чогось іншого.

Але недоліки XSS не повинні бути очистили, тому що будь-які подібні подання все одно є сміттям. Швидше подавайте заяву на заяву та пишіть запис журналу. Найкращий фільтр для встановлення XSS знаходиться в Основні правила mod_security.

Я використовую незбагненний, але досить ретельно виявлений атрибут тут новий ввід (), див. _xss метод.


4
2017-10-20 02:43





Редагувати: Дякую @mario за те, що вказали все залежить від контексту. Там дійсно немає супер спосіб щоб уникнути цього всіма випадками. Потрібно відповідне налаштування.


Редагувати: Я стою виправлено та дуже вдячний як для підтримки @bobince, так і @ Rook за цією проблемою. Тепер мені це ясно зрозуміло strip_tags не завадить атакам XSS в будь-якому випадку.

Я провів сканування всього мого коду перед тим, як відповісти, щоб дізнатись, чи я будь-яким чином виявився, і все добре завдяки htmlentities($a, ENT_QUOTES) Я використовую головним чином для боротьби з W3C.

Ось що я оновив цю функцію, щоб трохи імітувати той, який я використовую. Я все ж таки знаходжу strip_tags Приємно мати перед htmlentities, щоб, коли користувач намагається ввести теги, вони не забруднюють кінцевий результат. Скажіть, що користувач ввів: <b>ok!</b> це набагато краще, щоб показати це як ok! ніж друкувати повний текст перетворених htmlentities.

Дякую тобі дуже за те, що знайшли час відповісти і пояснити.


Якщо він надійде від користувача Інтернету:

// the text should not carry tags in the first place
function clean_up($text) {
    return htmlentities(strip_tags($text), ENT_QUOTES, 'UTF-8');
}

Якщо це виходить із задньої служби ... ні.

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


3
2017-10-20 02:42



strip_tagsце не заходи безпеки. Це дозволяє виконувати всі види XSS-бідності, такі як <div onmouseover="alert('script injection!')">. Там майже ніколи не є підставою для використання strip_tags. - bobince
@bobince, ви абсолютно правильно. Я повинен переглянути свою функцію перед копіюванням. strip_tags це досить ефективно при видаленні ВСІ XSS поки ви їх позбавите всіх. - Frankie
-1, тому що xss все одно може пройти через це. strip_tags () - це сміття. Правильна відповідь htmlspecialchars($var,ENT_QUOTES); - rook
@Frankie, але вам не потрібні теги для експлуатації xss. stackoverflow.com/questions/3762746/... - rook
Ці коментарі є дещо помилковими. strip_tags робить смугу все Теги HTML вийшли. Тому це є дійсною допомогою проти сирої ін'єкції html. htmlspecialchars  і  urlencode необхідно в додаток якщо отримані дані слід вставити verbatim в контекст tag / attribute. Але це найважче, все залежить від контексту. htmlspecialchars Один тільки не допомагає, якщо цільовий контекст, наприклад, є RSS &lt;script&gt; призведе до експлуатації XSS там. - mario


мені подобається htmlpurifier добре, але я бачу, як це може бути неефективним, оскільки воно досить велике. Крім того, це LGPL, і я не знаю, чи це підпадає під заборону GPL.


1
2017-10-20 02:10





На додаток до відповідь zerkms, якщо ви вважаєте, що вам потрібно прийняти представлений користувачем HTML (наприклад, редактор WYSIWYG), вам потрібно буде використовувати HTML-аналізатор, щоб визначити, що можна і неможливо надіслати.

Я використовую і рекомендую HTML Очищувач.

Примітка: Не навіть спробуй використовувати регулярний вираз :)


1
2017-10-20 02:11



ми просто зламали, команда консультанта з безпеки, фіксувала наші програми за допомогою регулярного виразу по всій території, так що це визначено стандартом у галузі для використання регулярних виразок - ninja
@ninja Використання регулярних виразів добре, але використовувати для аналізу HTML для безпеки не є гарною ідеєю. - alex
Що ви маєте на увазі ? це єдиний спосіб перевірити природу даних, що надходять від клієнта ... звичайно, якщо ви не використовуєте магію чи щось ... - ninja


Я здивований, що тут не згадується, але я віддаю перевагу htmlAwed до htmlPurifier. Це сучасний, красиво ліцензований, дуже маленький і дуже швидкий.


0
2017-09-26 14:20