如何阻止浏览器在GET请求中对表单值进行URL编码

18

我有一个表单,其中使用了method="get"。在表单中,我需要传递CSS文件的URL,但它会对其进行编码,如http%3A%2F%2Fwww...等。

有没有办法停止对URL进行编码,因为这样会破坏文件。

谢谢


你使用哪种服务器端语言来解析GET请求?你需要解码URL(大多数服务器端语言都内置了此功能)。 - Rowan
6个回答

15

背景

这个问题比起初看上去更加微妙。对于任何URL,它是URI标准的一种特定形式,其中某些字符是特殊的。在这些特殊字符中,包括`:`(方案分隔符)和`/`(路径或层次结构分隔符),以下是来自[RFC-2396][1]的所有保留符号列表:
reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
              "$" | ","
这与安全关系不大,更多地是涉及遵循标准:这些符号在任何URI、URL或URN中都具有特殊含义。当您需要将它们用作路径或查询字符串(GET请求为您创建一个查询字符串)的一部分时,您需要对它们进行转义。简单版的转义方法是:将UTF-8字节作为十六进制数并在前面加上%符号。在保留字符的情况下,这总是一个UTF-8中的单字节字符,因此以两个十六进制数字的形式进行转义。

解决方案路径

回到您的问题。您没有提到使用的语言。但是,任何用于互联网的语言都有一种编码或解码URL的方法。一些语言具有帮助函数来解码整个URL,但通常最好将其拆分为名称/值对,然后进行解码。这将为您提供绝对的URL路径。
注意:最好始终解码查询值,因为当人们输入值时,他们不会知道该值是否被保留,并且浏览器将为您编码它。不这样做会造成安全风险。
编辑:当您需要在页面内解码而不是在服务器端解码时,您需要JavaScript来完成此工作。请查看此页面以编码/解码URL,或使用Google查找其他网站。

因为我正在将值传递到 iframe,所以我无法在那一端解码。我所需要做的就是传递 CSS 路径<input type="hidden" name="css" value="http://www.site/css/basket.css" /> 但是这会被传递为编码路径而无法被识别? - kristina
@kristina:链的接收端会发生什么?也就是说,您已经在<iframe>元素的target属性中设置了一个URL。该页面必须知道CSS参数、名称以及如何访问该值。只是应用一些隐藏的输入字段,命名为“css”,并不能神奇地改变页面的CSS样式表,除非该页面被编程为这样做。 - Abel

10

不能。编码是为了生成有效的URL。

相反,您可以在接收代码中对该值进行解码(无论您使用哪个平台,在大多数情况下,URL解码都会自动完成)。


我正在从一个仅包含HTML页面的iframe中发布内容,这就是问题所在。 - kristina
@kristina:我不明白那会有什么区别。 - Matti Virkkunen

2
如果您使用XMLHttpRequest,则可以发送未编码的文本。您可以使用JavaScript完成此操作,但请记得将content-type设置为text/plain
content-type: text/plain

2

出于安全原因,您不能这样做。您必须在接收端收集并解码它。


1
当您使用FORM和GET方法以及一些特殊字符时,浏览器会对生成的查询进行编码。 对于支持在不刷新页面的情况下更改URL地址的新型浏览器(IE10+),可以解码URL查询字符串并更新地址。 我正在使用这样的脚本:
    <script type="text/javascript">
    if (history.pushState) { //IE10+
        var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + decodeURIComponent(window.location.search);
        window.history.pushState({path:newurl},'',newurl);
    }
    </script>

这将把一个http://example.com/page.html?path=foo%2Fbar转换回http://example.com/page.html?path=foo/bar


1
你可以使用JavaScript函数decodeURIComponent(Url)解码URL。 因为浏览器对特殊字符进行了URL编码。例如:https://www.example.com 被编码为%20https%3A%2F%2Fwww.example.com。在这里,特殊字符被%和其ASCII值替代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接