<转>表单Post&Get两个长度限制问题的分析

本文详细探讨了URL长度限制及POST数据量限制的原因,并提出了相应的解决方案。针对IE浏览器的URL长度限制进行了说明,并分析了ASP程序中POST数据的处理限制。

一、问题起因

在某项目释放后Bug统计的附件《释放后问题》里有:

问题一:CSV处理时,如果处理的主题数过多,发生URL参数上限的错误。
原因:可变长度的参数通过URL方式传递,会造成这种潜在的错误发生。
分析:1、属于2次发生问题,开发方面没有及时通过checklist等方式向组员传达相关注意事项;
         2、测试时没有作大批量数据的测试。
备注:1、作为经验添加至CheckList中,加强组内共享、检查的效果。
         2、加强测试点是否完备的检查,重点关注对开发方面共性问题的测试。

问题二:通过对模块原有GUI状况确认,进行CSV输出时,输出结果很大的场合,CSV文件的内容不能输出。
原因:没有考虑到POST数据量存在128K的大小限制。
分析:这属于新问题,以前从未遇见过,也没有进行过大规模的数据量测试。
备注:已将此类检查列出CheckList中。

做为一种经验积累,这些问题、原因及解决办法将被列入Checklist,那么:

第一个问题:URL参数上限的提法准确吗?上限是多少?
第二个问题:为什么POST时数据有限制?限制是128K吗?  

二、问题分析

问题一:

1)URL不存在参数上限的说法。该问题实际是IE对URL有长度限制的问题。
2)HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。[参1]
3)“可变长度的参数通过URL方式传递”实际是说提交表单时使用了GET方法,而不是POST方法。造成这种潜在错误的是使用GET方法提交表单数据。因为GET方法将数据放在URL里传递给服务器处理。
4)注意这个限制是整个URL长度,而不仅仅是你的参数值数据长度。
5)既然是IE对URL长度的限制,那么不管是GET方法还是POST方法都存在这个限制。
(关于FORM的GET和POST方法具体内容请参考相关资料[参2])  

建议:
1)了解应用程序所在的环境,如Web应用的浏览器、服务器环境,了解其特定的参数限制情况。
2)提交复杂数据尽量使用POST方法。注意FORM不写method属性时默认是使用GET方法。

结论(写入Checklist):
对使用GET方法提交数据时,在IE环境下,需要考虑URL长度2083字节的限制。  

问题二:

1)理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制。
2)“POST数据量存在128K的大小限制”不够准确,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
3)对于ASP程序,Request对象处理每个表单域时存在100K的数据长度限制。但如果使用Request.BinaryRead则没有这个限制。对于需要处理超过100K表单域数据的解决办法,请参考后面的[参3]。
4)由这个延伸出去,对于IIS 6.0,微软出于安全考虑,加大了限制[参4]。我们还需要注意:
    IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。
    IIS 6.0默认上传文件的最大大小是4MB。
    IIS 6.0默认最大请求头是16KB。
    IIS 6.0之前没有这些限制。

建议:
1)弄清楚运行环境的默认设定值有助于你的设计及对出现的问题做快速的解决。
2)应该考虑服务器版本。各个版本的IIS对这些参数的默认设定都不一样,有必要的话,找资料整理出一份对照表。这样开发与测试时都有个参考。
3)IIS 6.0的这些限制实际只是它的默认设定值而已,实际应用环境你可以修改它们。
    在WINNT\system32\inetsrv\MetaBase.xml里默认定义了:
        AspBufferingLimit="4194304"           对应于上传文件最大大小
        AspMaxRequestEntityAllowed="204800"    对应于POST最大数据量
        ...

结论(写入Checklist):
使用ASP时,需要考虑POST表单每个域一般读取处理时有100KB的限制。充分考虑是否使用Request.Binary。

参考资料:

1、Maximum URL Length Is 2,083 Characters in Internet Explorer
2、Hypertext Transfer Protocol--HTTP/1.1
3、PRB: Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form
4、IIS 6.0 Troubleshooting [Client Requests Error-out or Time-out一节]

<think> 我们正在处理一个关于HTTP GET请求的问题。用户想在HTML页面中使用GET方法提交一个变量a,其值为1。 根据引用[3],我们可以使用一个表单(form)并设置method为"get",然后在表单中放置一个输入元素(input)并设置其name属性为"a",我们可以预先设置其value为"1",或者让用户输入,但用户要求是值为1,所以我们可以设置value="1"。 另外,引用[1]展示了一个GET请求的示例,其中在URL中直接包含了"?a=1"。 因此,有两种方法: 1. 使用表单(form)并设置method为"get",在表单中放置一个隐藏的输入字段(这样用户看不到,但提交时会包含)或者一个普通输入字段(如果允许用户修改的话),但要求是值为1,所以我们可以用隐藏字段。 2. 直接构造一个链接,在链接的URL后面加上"?a=1",这样点击链接就会发送GET请求,并且携带参数a=1。 用户明确要求使用GET方式提交,所以这两种方法都可以。 根据问题,用户要求“在HTML页面中用GET方式提交”,所以我们可以提供两种方式的示例代码。 注意:引用[2]中使用了工具来修改请求,但用户要求的是在HTML页面中实现,所以我们需要提供HTML代码。 我们参考引用[3]中的表单示例,将其修改为提交变量a,值为1。 方法一:使用表单(隐藏字段) 我们可以创建一个表单,使用GET方法,并添加一个隐藏的input,name为a,value为1。然后提供一个提交按钮,用户点击按钮就会提交。 方法二:使用超链接 我们可以创建一个超链接,其href属性设置为当前页面URL加上查询字符串"?a=1",这样点击链接就会发送GET请求。 注意:表单提交后通常会跳到action指定的页面,而超链接则是跳到href指定的页面。如果希望在当前页面处理,那么表单的action可以设置为当前页面(或者留空,默认为当前页面),超链接的href也可以设置为当前页面。 下面我们提供两种方法的示例代码。 另外,根据引用[1],GET请求的格式是在URL后面添加查询参数,以问号开始,参数格式为name=value,多个参数用&连接。 因此,我们生成的HTML代码应该符合这些要求。 注意:由于引用[4]提到了一些HTTP头部的信息,但这个问题主要关注GET请求的提交,所以暂时不需要考虑这些头部。 现在,我们编写示例代码。 </think> 在HTML页面中使用GET方式提交名为`a`、值为`1`的变量,可以通过以下两种方法实现: ### 方法1:表单提交 ```html <!-- 表单默认使用GET方法提交 --> <form action="目标URL" method="GET"> <input type="hidden" name="a" value="1"> <!-- 隐藏字段传递固定值 --> <input type="submit" value="提交"> </form> ``` **原理**: 表单提交时,浏览器会将参数拼接为`?a=1`附加到目标URL(如`目标URL?a=1`)。`action`属性指定接收数据的服务端URL,`hidden`类型字段不会显示在页面上[^3]。 ### 方法2:超链接提交 ```html <a href="目标URL?a=1">点击提交数据</a> ``` **原理**: 直接通过URL查询字符串携带参数,点击链接触发GET请求[^1]。 ### 关键说明: 1. **GET请求特点**: - 参数通过URL明文传输(可见于地址栏) - 有长度限制(约2048字符) - 适合非敏感数据传输[^1][^3] 2. **查看效果**: - 提交后浏览器地址栏将显示:`目标URL?a=1` - 服务端可通过`$_GET['a']`(PHP)或`request.args.get('a')`(Python Flask)获取值 > 提示:敏感数据需改用POST方法(修改`method="POST"`并添加CSRF防护)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值