Достаточно ли кодирования URL для атрибута href для защиты от XSS? - PullRequest
0 голосов
/ 26 октября 2018

Согласно OWASP , пользовательский ввод в атрибут href должен "... за исключением буквенно-цифровых символов, экранировать все символы со значениями ASCII меньше 256 с форматом экранирования% HH."

Я не понимаю обоснования этого.Почему кодирование URL не может сделать работу?Я потратил часы, пытаясь создать вектор атаки для строки URL, которая динамически генерируется и представляется пользователю, и мне кажется, что это довольно надежная защита от атак XSS.

Я такжеуже давно занимаюсь этим, и большинство людей советуют использовать кодировку URL вместе с кодировкой HTML.Я полностью понимаю, почему HTML-кодирование недостаточно, поскольку все еще могут использоваться другие векторы, такие как onclick=alert()

Может кто-нибудь показать мне пример вектора атаки, используемого для манипулирования href, который отображается с помощью кодирования URL ибез HTML-кодировки или кодировки, предложенной owasp.org в правиле № 5?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Кодировка зависит от контекста.Если у вас есть URL-адрес внутри HTML-документа, вам потребуется и кодировка URL, и кодировка HTML, но в разное время.

... за исключением буквенно-цифровых символов, экранируйте все символы со значениями ASCII меньше, чем256 с экранированием% HH.

Рекомендуется использовать кодировку URL.Но не для всего URL.Контекст заключается в том, что при вставке параметров URL-адреса в URL-адрес они должны быть закодированы в формате URL, чтобы разрешить, например, & символов в значении.

Не кодировать полные или относительные URL-адреса с помощью кодировки URL!

Это отдельное правило для всего URL. После того, как URL закодирован, затем при вставке в html-атрибут вы применяете html-кодировку.

Нельзя применять URL-кодировкудо полного URL-адреса, поскольку он уже закодирован и повторное кодирование приведет к двойному кодированию, что приведет к повреждению URL-адреса.Например, любые символы % в исходном URL-адресе будут неправильными.

Кодирование HTML необходимо, поскольку такие символы, как амперсанды, являются допустимыми символами в URL-адресах, но имеют другое значение в HTML из-за символьных сущностей.URL может содержать строки, которые выглядят как сущности HTML, но их не нужно кодировать при вставке в документ HTML.

0 голосов
/ 27 октября 2018

Нет, если кто-то введет javascript:alert(0), это сработает. Никакой метод кодирования не помешает этому, вы должны попытаться заблокировать схемы URI javascript вместе со всеми другими схемами URI, которые допускают использование XSS, например, data: и blob:.

Рекомендуемое действие - не отображать вводимые пользователем ссылки в ссылку.

Кроме того, важно помнить, что не нужно просто точно блокировать эти схемы, используя что-то вроде preg_replace, так как перевод строки будет обходить это и создавать полезную нагрузку XSS. Таково: java%0a%0dscript:alert(0);. Как вы можете видеть, символ CRLF был помещен в середине полезной нагрузки, чтобы PHP (или другие серверные языки) не распознал его как javascript:, который вы заблокировали. Но HTML все равно будет отображать это как javascript:alert(0);, поскольку символ CRLF является пробелом и игнорируется HTML (в пределах значения атрибута элемента), но интерпретируется PHP и другими языками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...