您可以传递给 Wininet 函数 HttpOpenRequest 的最大 URL 长度是多少?

Posted

技术标签:

【中文标题】您可以传递给 Wininet 函数 HttpOpenRequest 的最大 URL 长度是多少?【英文标题】:What is the maximum URL length you can pass to the Wininet function, HttpOpenRequest? 【发布时间】:2009-06-18 00:06:04 【问题描述】:

【问题讨论】:

【参考方案1】:

WinInet.h 中有一些最大长度常量:

...
//
// maximum field lengths (arbitrary)
//

#define INTERNET_MAX_HOST_NAME_LENGTH   256
#define INTERNET_MAX_USER_NAME_LENGTH   128
#define INTERNET_MAX_PASSWORD_LENGTH    128
#define INTERNET_MAX_PORT_NUMBER_LENGTH 5           // INTERNET_PORT is unsigned short
#define INTERNET_MAX_PORT_NUMBER_VALUE  65535       // maximum unsigned short value
#define INTERNET_MAX_PATH_LENGTH        2048
#define INTERNET_MAX_SCHEME_LENGTH      32          // longest protocol name length
#define INTERNET_MAX_URL_LENGTH         (INTERNET_MAX_SCHEME_LENGTH \
                                        + sizeof("://") \
                                        + INTERNET_MAX_PATH_LENGTH)
...

【讨论】:

【参考方案2】:

HttpOpenRequest 没有最大长度,但您定位的服务器软件可能会对您的 URL 长度有限制。

Apache(服务器)

我早期尝试测量 Web 浏览器中的最大 URL 长度 遇到服务器 URL 长度限制 大约 4,000 个字符, 之后 Apache 生成一个“413 实体太大”错误。我使用了 找到当前最新的 Apache 构建 在 Red Hat Enterprise Linux 4 中。 仅官方 Apache 文档 提到一个 8,192 字节的限制 请求中的单个字段。

Microsoft Internet 信息服务器(服务器)

默认限制为 16,384 个字符 (是的,微软的网络服务器接受 URL 比 Microsoft 的 Web 更长 浏览器)。这是可配置的。

Perl HTTP::Daemon(服务器)

最多可以使用 8,000 个字节。那些 构建 Web 应用程序服务器 使用 Perl 的 HTTP::Daemon 模块将 遇到 16,384 字节的限制 所有 HTTP 请求的总大小 标题。这不包括 POST方法表单数据,文件上传, 等等,但它确实包含 URL。在 练习这会导致 413 错误 当 URL 明显更长时 超过 8,000 个字符。这个限制 可以很容易地删除。寻找所有 在 Daemon.pm 中出现 16x1024 并用更大的值替换它们。 当然,这确实增加了你的 遭受拒绝服务攻击。

(来自Boutell.com)

【讨论】:

您知道这些限制是包括名称值对(例如 url?data=x..)还是只是 url 本身? @David Sykes:我相信限制是基于用于存储字符的缓冲区的大小,所以我假设包括名称-值对。但我只是推测。 “HttpOpenRequest 没有最大长度” - This answer 不同意该声明。【参考方案3】:

I would suggest less than 2000 characters.,但这个KB article 表明 Internet Explorer 的限制为 2083,这也可能适用于您的情况。

【讨论】:

是的,我们在这个数量上失败了

以上是关于您可以传递给 Wininet 函数 HttpOpenRequest 的最大 URL 长度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

C:为啥你可以通过值传递(给函数)一个结构,而不是一个数组?

可以将任何原始类型传递给需要指针的函数吗?

Frida - Windows 原生应用程序 - 读取 Wininet.h 公开的结构

如何将字符串传递给函数并返回整数?

下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息

您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?