HTTP URL - 参数名称允许使用的字符

26

是否有正式限制可以使用哪些字符作为URL参数名称?

我一直在阅读RFC3986(“统一资源标识符(URI):通用语法”),但没有得出明确的结论。

我知道有实际限制,但如果我正确转义,是否真的禁止像这样做:

param with\funny<chars>=some_value

只要我正确转义它:

param%20with%1cfunny%3cchars%3e=some_value
4个回答

13

在URI规范中,转义参数名称没有任何限制。但是你使用的服务器端软件可能存在限制。如果您使用“自制”脚本来解释URI,则尤其如此。


这正是我一直在问的原因...https://dev59.com/8HRA5IYBdhLWcg3wzhbZ我猜我的答案需要彻底改进才能在不寻常的情况下正确。 - Tomalak
啊,这会使情况变得相当复杂。特别是因为使用 & 作为分隔符只是一种约定;其他的也可以使用,例如曾经经常使用的 ,;。此外,许多服务器引擎(如 PHP、Rails 等)支持嵌套参数,因此这将是一个带有查询的合法 URI:http://example.com/?a=b;c[1]=x;c[2]=y … 许多 Web 应用程序实际上使用此查询表示法来获取类似数组的数据的表单数据(选项、复选框等)。 - Konrad Rudolph
所以我想问题关键在于,“没有一个单一正确的函数可以从 URL 中提取参数” - 除非你准备接受“c [1] = x”是服务器端约定,并且你正在寻找的参数实际上在客户端上被称为“c [1]”(这是事实正确的,但对于习惯于服务器端编程的人来说可能会感到奇怪...)。 - Tomalak
请允许我提出一个问题。现在是2017年10月,我正在使用Bluehost(Apache)。我试图传入一个实际的部分文件名。文件名为2017-10-15.jpg,当我使用showplot.htm?dt=2017-10-15并使用Javascript行document.write('<img src="' + dt + '.jpg"/>')时,我希望它能够显示出来 - 但它没有工作。它显示除了我尝试像这样连接的行之外的所有内容。这是因为它无法处理连字符吗? - SDsolar

8

您还应该阅读RFC2396。它似乎比RFC3986更具信息性。


4
第3.4节 ("查询组件") 写道:"查询组件是一串需要被资源解释的信息字符串。" 这基本上意味着 "任何东西都可以",正如我所想的那样。 - Tomalak
很遗憾,它并不是特定于HTTP的。但我想这里没有标准,只有约定俗成的做法。 - Tomalak

2
根据RFC 2396,参数名称和值可以包含大写/小写字母、十进制数字和-_.!~*'()字符。其他所有内容都需要进行转义处理。

2
RFC 2396已被RFC 3986所取代(请参见此处,特别是在RFC 3986的附录D.2下),因此a query string can legally include the following unencoded characters/ ? : @ - . _ ~ ! $ & ' ( ) * + , ; = - OfirD

2

URLs有保留字符,但只要你进行转义(urlencode),就应该没问题。

根据所使用的框架,如果您尝试提交可疑值,则可能会出现异常。 ASP.NET具有内容过滤功能,如果您尝试提交“不安全”的数据(如脚本或HTML),则会抛出异常。 这是框架的一个特性,而不是URL语法强制执行的限制或规则。


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