服务器响应时,为什么FireFox和某些其他浏览器会更改地址栏中的URL

|| 由于以下问题,本季度我很难满足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,以使其更具可读性。我告诉他们,我无能为力。但是,公平地说,他们反驳说,如果您尝试以下网址...
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
... lo,当我的本地服务器响应时,它会被重写: http://localhost/http.mygarble.com/hello.txt?displayname =%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22 我已经在Fiddler中运行了此程序,但看不到任何异常,并且我已关闭了重写引擎。我正在运行Apache。 更令人困惑的是,不同的浏览器做出不同的响应。打字...
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,以使其更具可读性。像IE一样,Safari也只保留URL。 我现在要检查Google \\\的响应以获取线索。是否有一些HTTP指令指示浏览器不要在响应时插入URL。 任何帮助,非常感谢! 亲切的问候, 詹姆士     
已邀请:
        google URL栏结果不会更改,因为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。     
        在我发现这些字符只显示为已解码但没有真正改变之前,在Firefox的地址栏中,我进行了测试以了解发生了什么。 这就引出了这个演示:\“神奇的Firefox地址栏解码器\”,它演示(并列出)在地址栏中解码显示的字符以及由脚本从地址栏读取的字符。在不同的浏览器中运行页面会显示差异。 Firefox变化最大,Chrome变化仅几个字符,IE和Safari不变。由Firefox解码的字符的选择似乎与由encodeUriComponent编码的字符的选择无关。希望这对任何人都有帮助。     
我在这个问题上取得了一些进展。考虑以下:
http://www.google.com/%22%%203E%3Cscript%3Ealert%28123%29%3C%2Fscript%3%20E%22
在这种情况下,浏览器保留URL不变的原因是服务器返回HTTP 404响应,表示找不到资源。在这种情况下,Firefox不会更改URL。如果您改用提示Google给出200 OK响应的URL,例如以下内容...
http://www.google.com/?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22
...您会发现,当服务器以更改的URL响应时,FireFox将更改URL。 自己尝试。实际上,如果您将更改的URL剪切并粘贴到电子邮件中,则会发现字符保持不变。 除了HTTP响应代码外,这与服务器实际响应的内容无关。如果服务器响应“ 404 Not found”,则FireFox选择保留地址栏中的URL。如果服务器以\'200 OK \'响应,则FireFox选择更改URL,以使某些字符转义,以使URL更具可读性。如果找不到资源,则逻辑是我认为这样做没有意义。 我假设您使用的是Firefox。实际上,浏览器对这种情况的处理有所不同。我已经尝试在多个浏览器中键入此URL(第二个URL)。我总结了结果: Google Chrome与Firefox相同。引号和尖括号显示为普通字符,不转义。 Internet Explorer使URL保持不变,但显示有关XSS的消息警告,并且不会显示Google页面。 Opera在地址栏中仅显示\'www.google.com \'。 Safari保持URL不变。 我希望这可以解决问题。要使自己相信所有这些,您可以做的一件事就是运行像Fiddler这样的HTTP调试代理。您可以看到,在每种情况下,服务器返回的内容都是相同的,这只是服务器在响应时每个浏览器如何选择更改URL的问题。 亲切的问候, 詹姆士     

要回复问题请先登录注册