我想构建某种脚本来判断网站是否使用 https。
以编程方式确定这一点的方法是什么?我尝试访问我自己的一个域,我知道该域没有 https,但服务器仍然给了我一个 200 代码(至少根据我使用的 Chrome 扩展)。
是否有某种我可以捕获的错误,或者其他一些在站点之间保持一致的信息?
最佳答案
理论上,您应该提前知道是否应该使用 HTTPS。我的意思是,用户有部分判断期望对某些网站使用 HTTPS。在现实世界中,当您走进银行和走进咖啡店时,通常会有不同的安全期望。您通常不愿意向酒吧后面的人提供与银行家相同的详细信息。这同样适用于网络。
也就是说,您确实可以测试是否可以与某个网站建立 HTTPS 连接。问题是无法建立此连接可能意味着以下几件事:
- 该网站根本不支持 HTTPS,
- 出现临时连接问题,
- 有攻击者阻止您建立该连接。
许多网站会尝试通过重定向将您从 HTTP 升级到 HTTPS,以使用户知道 HTTPS 可用,并希望让他们在下次访问该网站时期待它。有些网站甚至会使用 HTTP 严格传输安全 (HSTS) 来强制您在下次访问该网站时记住该升级。如果您可以假设您的第一次连接没有受到影响,那么这是一个合理的折衷方案。
What is a way of programmatically determining this? I tried visiting one of my own domains that I know does not have https, but the server still gave me a 200 code.
如果您的域没有有效的证书,则证书验证应该会失败,并且您根本无法获得任何 HTTP 状态代码作为响应。
我猜测您使用的脚本不会执行任何证书验证,并且这些域可能指向共享托管环境,其中具有相同 IP 地址的其他服务启用了 HTTPS。
您至少应该确保您的脚本正确验证证书:
- 您应该能够验证该证书是否真实、由您信任的 CA 颁发且及时有效。 (这通常在 RFC 3820 和 RFC 5820 中指定)
- 您应该能够验证它对于您要查找的主机名是否有效。 (这通常在 RFC 2818 和 RFC 6125 中指定。)
并非所有 SSL/TLS 库都默认启用此功能(尤其是第二点)。
我不确定您的脚本使用什么或您提到的扩展程序的用途。例如,如果您使用的是 curl
,请确保您没有使用 -k
或 --insecure
,并且您使用的是wget
,请确保您没有使用--no-check-certificate
。如果您使用 libcurl
,则应确保您是 using the VERIFYPEER
and VERIFYHOST
properly 。如果这不是您正在使用的,请在其他实现中查找类似的选项,并且不要忽略浏览器警告。
关于http - 如何以编程方式测试网站是否使用 HTTPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909015/