【问题标题】:Reason behind WinHttpOpenRequest default url encoding behaviourWinHttpOpenRequest 默认 url 编码行为背后的原因
【发布时间】:2018-12-18 18:18:59
【问题描述】:

我的应用程序的一部分依赖于基于 Win32 API 的 HTTP 客户端。

每个 HTTP 查询都是通过调用 WinHttpOpenRequest 来启动的

std::wstring method = L"POST";
std::wstring path = L"/foo/bar%baz";
WinHttpOpenRequest(
            m_connectionHandler,
            method.c_str(),
            path.c_str(),
            NULL,
            WINHTTP_NO_REFERER,
            WINHTTP_DEFAULT_ACCEPT_TYPES,
            WINHTTP_FLAG_SECURE);

到目前为止,我一直依赖WinHttpOpenRequest 的默认行为来正确地对查询进行百分比编码。

我刚刚发现文字字符 % 在默认情况下未转义,我必须将 WINHTTP_FLAG_ESCAPE_PERCENT 作为附加标志传递。

我真的不明白为什么这个 API 会正确编码每个保留字符,除了百分比字符本身。这种选择背后有什么务实的原因吗?我可以安全地使用这个附加标志,还是有什么我看不到的陷阱?

我能想象的唯一原因是避免使用默认行为的双百分比编码,即我已经对我的查询进行百分比编码,而WinHttpOpenRequest 无法猜测它读取的百分比字符是否是百分比编码的结果与否。

【问题讨论】:

  • 如果百分号始终是 URL 编码的,您将无法自己将其用于 URL 编码目的,例如然后%20 将被转换为%%20,可能不是您想要的。
  • @IInspectable 我理解,但如果我在调用此函数之前完成了编码,我会期望使用 WINHTTP_FLAG_ESCAPE_DISABLE 完全禁用 WinHttpOpenRequest 上的所有 url 编码。还是允许某种混合模式,即一些保留字符已经编码但不是全部?
  • 如果您不提供任何标志,WinHttpOpenRequest 可以使用任何资源定位器。不安全的字符被 URL 编码,而 URL 编码的序列被单独留下。这涵盖了绝大多数用例,包括 URL 的某些部分是 URL 编码的,而其他部分仍然包含不安全字符的情况。当您的应用程序将来自不同来源(应用程序代码和库)的 URL 拼凑在一起时,就会发生这种情况。要选择特殊待遇,您必须提供标志。这遵循针对最常见用例进行优化的指导原则。
  • 非常感谢,您的回答很有道理,它回答了我的所有想法。随意填写答案,我会接受的。

标签: winapi winhttp


【解决方案1】:

% 也可以用作转义字符,例如不能只用printf("%") 打印出'%',而是用printf("%%")

如果您阻止% 的转义功能,正如 IInspectable 所说,您将无法使用转义功能,如 %20 等:%2B、%2F、%3F、%3D、 %21...

msdn document上的描述,标志WINHTTP_FLAG_ESCAPE_PERCENT表示

为 pwszObjectName 传入的字符串是从 LPCWSTR 转换而来的 到 LPSTR。所有不安全字符都转换为转义序列 包括百分号。

但是,默认情况下,

除百分号外的所有不安全字符都是 转换为转义序列。

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 2021-01-13
    • 2012-09-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2011-01-31
    • 2011-01-15
    相关资源
    最近更新 更多