由于以下问题,我在本季度难以满足 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
...瞧,当我的本地服务器响应时,它会被重写:
我已经通过 Fiddler 运行了这个,看不到任何不愉快的地方,我已经关闭了重写引擎。我正在运行 Apache。
更令人困惑的是,不同的浏览器响应不同。打字...
http://localhost/http.mygarble.com/hello.txt?displayname=%22%3E%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%22
...进入 Chrome 产生:
进入 IE,URL 保持不变。在 Opera 中,除非您单击地址栏,否则查询字符串会被删除,这让我相信浏览器会在响应时自动更改地址栏中的 URL,以使它们更具可读性。Safari 和 IE 一样,只保留 URL。
我现在要检查谷歌的回复以寻找线索。是否有一些 HTTP 指令指示浏览器不要干预 URL 响应。
非常感谢任何帮助!
亲切的问候,
詹姆士