c - Windows 上的 InternetOpenUrl 函数是否足够安全?如果没有,如何让它更强大?

标签 c winapi wininet

InternetOpenUrl()文档说:

WinINet functions use a simple check against certificates by comparing for matching host names and simple wildcarding rules.

这表明它并没有做太多,并且可以通过例如规避它。伪造自签名证书。

另一方面,KB 182888 "How To Handle Invalid Certificate Authority Error with WinInet"表明 WinInet 函数确实在检查根 CA。

什么是真相?我想要InternetOpenUrl()如果证书无效则失败。或者,如果它没有失败,则以最简单的方式自行验证证书。我该怎么做?

最佳答案

;博士;是的,InternetOpenUrl() 默认检查证书颁发机构。

我做了一个小测试:

#include <cassert>
#include <iostream>
#include <windows.h>
#include <WinInet.h>

int main(int argc, char *argv[])
{
    HINTERNET internet = InternetOpenA("Test Agent",
                                      INTERNET_OPEN_TYPE_DIRECT,
                                      NULL,
                                      NULL,
                                      0);
    assert(internet != NULL);
    char url[] = "https://urlgoeshere";
    HINTERNET connection = InternetOpenUrlA(internet,
                                           url,
                                           NULL,
                                           0,
                                           0,
                                           NULL);
    std::cout << "error while opening url " << url << " : "
              << GetLastError()
              << " handle: " << connection << std::endl;


    return 0;
}

是的,当使用自签名证书时,它会返回错误代码 12045,即 ERROR_INTERNET_INVALID_CA。

关于c - Windows 上的 InternetOpenUrl 函数是否足够安全?如果没有,如何让它更强大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545544/

相关文章:

c - 我怎样才能再次这样做?在C中

c++ - SolFS 中这些函数的等价物?

java - JNI 字符串和 C 字符串

caching - 如果 FindNextUrlCacheEntry() 失败,我如何重新检索失败条目的信息?

c++ - 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动验证,但通过 IP 连接时会成功?

c++ - 使用 fscanf 解析文件

c++ - 如何获取另一个应用程序的所有窗口的句柄

c# - 如何在 C# 中使用 axWindowsMediaPlayer 跳转 X 秒

winapi - 如何使另一个应用程序的窗口透明?

c++ - WinInet 输出中的随机字符