Почему FireFox и некоторые другие браузеры изменяют URL в адресной строке, когда сервер отвечает - PullRequest
4 голосов
/ 18 июня 2011

В этом квартале у меня возникли проблемы с соблюдением требований PCI-DSS из-за следующей проблемы.

Когда вы набираете следующее в браузере ...

http://www.mygarble.com/main/Community/Chat?command=CHAT_MESSAGE&displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

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

http://www.mygarble.com/main/Community/Chat?command=CHAT_MESSAGE&displayname="><script>alert(123)<%2Fscript>"

Вы видите, что некоторые экранированные символы в исходном URL были заменены на экранированные.

Причина, которую я привел для этого, заключается в том, что FireFox автоматически переформатирует URL-адрес в адресной строке, когда сервер отвечает, независимо от того, как он отвечает, чтобы сделать его более читабельным. Я сказал им, что ничего не могу с этим поделать. Однако, честно говоря, они возразили, что если вы попробуете следующий URL ...

http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22

... при ответе серверов Google браузер не меняет URL-адрес и остается неизменным:

http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22

И у них есть точка.

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

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

... и вот оно переписывается, когда мой локальный сервер отвечает:

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

Я пропустил это через Fiddler и не вижу ничего плохого, и я выключил механизм перезаписи. Я использую Apache.

Чтобы добавить к путанице, разные браузеры реагируют по-разному. Typing ...

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

... в Chrome дает:

http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

В IE URL остается точно таким же. В Opera строка запроса отбрасывается, если вы не нажмете на адресную строку, что подтверждает мою уверенность в том, что браузеры автоматически меняют URL-адреса в адресных строках в ответ, чтобы сделать их более читабельными. Safari, как и IE, оставляет URL-адрес в покое.

Сейчас я собираюсь проверить ответ Google на предмет подсказок. Существует ли какая-либо HTTP-директива, которая предписывает браузеру не вмешиваться в URL-адрес при ответе.

Любая помощь очень признателен!

С уважением,

Джеймс

Ответы [ 3 ]

1 голос
/ 27 марта 2013

Прежде чем я узнал, что символы отображались только в декодированном виде, но не изменились, в адресной строке Firefox я настроил тест, чтобы выяснить, что произошло.

Это приводит к демонстрации: 'Волшебный декодер адресной строки Firefox' , который показывает (и перечисляет), какие символы отображаются декодированными в адресной строке и что чтение из адресной строки скриптом .Запуск страницы в разных браузерах показывает различия.

Firefox меняет больше всего, Chrome меняет всего несколько символов, IE и Safari ничего не меняют.Выбор символов, которые декодируются в Firefox, кажется, не связан с выбором символов, которые кодируются с помощью encodeUriComponent.Надеюсь, это может кому-нибудь помочь.

1 голос
/ 18 июня 2011

Результат в строке URL-адреса Google не изменяется, поскольку последовательность кодирования URL-адреса недопустима («% 3» не является допустимой последовательностью кодирования - должно быть две шестнадцатеричные цифры).Если вы добавляете ту же часть URI из первой ссылки в домен Google, например:

http://www.google.com/%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

Она также заменяется в адресной строке неэкранированными символами (в Firefox 4.0.1, Mac OS X Snow Leopard, Нидерланды)

Интересную дискуссию о том, что убежать, а что нет, см., Например.https://bugzilla.mozilla.org/show_bug.cgi?id=425480.

0 голосов
/ 20 июня 2011

Я достиг некоторого прогресса в этом вопросе. Учтите следующее:

http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22

Причина, по которой браузер оставляет URL-адрес без изменений в этом случае, заключается в том, что сервер возвращает ответ HTTP 404, означающий, что ресурс не может быть найден. В этих случаях Firefox не вносит изменений в URL. Если вместо этого вы попробуете URL-адрес, который запрашивает ответ 200 OK от Google, такой как следующий ...

http://www.google.com/?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22

... вы обнаружите, что FireFox изменит URL, когда сервер ответит измененным URL.

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

Это не имеет ничего общего с тем, что сервер на самом деле отвечает, за исключением HTTP-кода ответа. Если сервер отвечает «404 Not found», FireFox решает оставить URL-адрес в адресной строке без изменений. Если сервер отвечает «200 OK», FireFox выбирает изменить URL-адрес, исключая некоторые символы, по-видимому, в попытке сделать URL-адрес более читабельным. Если ресурс не может быть найден, логика заключается в том, что нет смысла делать это.

Я предполагаю, что вы используете Firefox. На самом деле браузеры относятся к этому случаю по-разному. Я попытался набрать этот URL (второй) в нескольких браузерах. Я подвел итоги:

Google Chrome делает то же самое, что и Firefox. Кавычки и угловые скобки отображаются как обычные символы без экранирования.

Internet Explorer Оставляет URL-адрес без изменений, но выдает предупреждение о XSS и не отображает страницу Google.

Opera Показывает только "www.google.com" в адресной строке.

Safari Оставляет URL без изменений.

Надеюсь, это прояснит ситуацию. Одна вещь, которую вы можете сделать, чтобы убедить себя во всем этом, - запустить прокси-сервер отладки HTTP, такой как Fiddler. Вы можете видеть, что в каждом случае то, что возвращает сервер, идентично, это просто вопрос того, как каждый браузер решает изменить URL-адрес, когда сервер отвечает.

С уважением,

Джеймс

...