вторник, 2 октября 2012 г.

Browser Security Handbook. Глава 1, пункт 2

Руководство по безопасности браузеров (Browser Security Handbook). Глава 1

1. Унифицированный указатель ресурса (URL)

 

2.         Unicode в Url

Некоторые технологии, связанные с перемещением веб-контента и Url-адресов, не имеют особого набора символов, определенных соответствующим RFC. В RFC-3986 сказано: «На местном или региональном уровне, а также с усовершенствованием технологии, пользователи могут воспользоваться возможностью применения широкого диапазона символов; такое использование не определенно в настоящей спецификации». Тот же пренебрежительный подход принят в спецификации http-заголовка.
В результате, в контексте web-страницы, любой старший бит пользовательского ввода, может и должен быть использован как %nn-последовательности, но нет конкретных указаний о том, как перекодировать введенный пользователем адрес в собственную кодовую страницу системы, общаясь с другой стороной, которой не может передать эту кодовую страницу. Системе, которая использует кодировку UTF-8 и получает URL, содержащий Unicode в пути, соответствует исходная последовательность 0xC4 0x85. Однако, при отправке на сервер, который использует ISO-8859-2, исправленное значение должно послать 0xB1 (или, в качестве альтернативы, должна быть включена дополнительная информация о кодировке на клиенте, чтобы осуществить преобразование на стороне сервера). На практике же, большинство браузеров, по умолчанию, отправляют данные в кодировке UTF-8 на любой, введенный вручную в поле URL, текст, и используют данную кодировку страницы на всех последующих ссылках.
Еще одно ограничение Url прослеживается в DNS. RFC 1035 позволяет использовать в метках DNS только символы A-Z a-z 0-9 и «.», использующуюся  в качестве разделителя; распознаватель[4] позволяет использовать дополнительно подчеркивание « в DNS-именах, что нарушает стандарт. С развитием Всемирной паутины,  появилась необходимость в именах хостов использовать символы нелатинского алфавита. И использование %nn-кодирования это не альтернатива, потому что %, как такового, не было в списке.
Чтобы решить эту проблему, RFC 3490 изложила довольно надуманную схему кодирования, которая допускает Unicode-символы хранить в DNS-метках, и RFC 3492, описывающий конкретные реализации в DNS-метрике, часто называемый «Punycode», который обозначается следующим образом:

xn--[US-ASCII-часть]-[закодированные данные в Unicode]

Браузер, поддерживающий Punycode, преобразовывает неизвестные символы, содержащиеся в доменном имени, в последовательность ASCII-символов, а затем выполняет обычный DNS-поиск в кодированной строке.
Ниже показан пример преобразования в Punycode:


Соответствующие ключи безопасности различные в старшем бите URL-обработки приведены в таблице 2.

Таблица 2

Описание
MSIE7
MSIE8
FF3
Сафари
Опера
Хром
Android
Требование к кодировке URL-пути, когда следуют обычные ссылки
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
Требование к кодировке строки запроса URL, когда следуют обычные ссылки
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
Требование к кодировке URL-пути для XMLHttpRequest- запроса
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
кодировка страницы
Требование к кодировке строки запроса URL для XMLHttpRequest-запроса
кодировка страницы
кодировка страницы
кодировка страницы
искалечен
кодировка страницы
искалечен
искалечен
Требование к кодировке URL-адресов, введенных вручную
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
Требование к кодировке строки запроса URL, введенных вручную
перекодирование в 7-бит
перекодирование в 7-бит
UTF-8
UTF-8
голый?
UTF-8
UTF-8
Необработанные данные Unicode в именах хостов автоматически преобразовываются в Punycode?
ДА
ДА
ДА
ДА
ДА
ДА
НЕТ
«Процент-кодирование» на основе UTF-8 в именах хостов автоматически преобразовываются в Punycode?
ДА
ДА
на повтор
ДА
ДА
ДА
НЕТ
Отображение адресной строки Unicode в имени хоста
Unicode
Unicode
Unicode
Unicode
Unicode
Unicode
Punycode
Отображение адресной строки Unicode за пределами имени хоста
Unicode
Unicode
Unicode
Unicode
как?
Unicode
n/a


ПРИМЕЧАНИЕ 1: Firefox, как правило, использует кодировку UTF-8 для кодирования большинства Url, но будет посылать символы, поддерживаемые ISO-8859-1, с помощью данной кодовой страницы.
ПРИМЕЧАНИЕ 2: Для защиты от фишинга многими браузерами вводятся дополнительные ограничения на использование некоторых или всех символов Unicode в некоторых доменах верхнего уровня.
 

 

Комментариев нет:

Отправить комментарий