在 IIS 7.5 上使用 ASP.NET 时,如何确保始终通过 SSL 发送 cookie?

信息安全 应用安全 Web应用程序 tls 饼干
2021-08-18 07:53:54

Firesheep 将不安全的 cookie 交换问题带到了最前沿。

当您与 Web 用户通信时,如何确保所有 cookie 交换只能通过与服务器的 SSL 安全连接进行?

我们的场景是,Web 应用程序是用 ASP.NET 4.0 编写的,并托管在运行 IIS 7.5 的 Windows Server 2008 R2 上,如果这会缩小范围的话。

3个回答

您可以使用app.config强制它;格式是(在<system.web>部分)

<httpCookies domain="String"
             httpOnlyCookies="true|false" 
             requireSSL="true|false" />

所以你真的想要,至少

<httpCookies requireSSL='true'/>

但最好你也打开 httpOnlyCookies,除非你正在做一些非常古怪的 javascript。

保护您的网站免受 Firesheep(及相关攻击)的最安全方法:

  • 移至站点范围的 SSL 保护:将整个站点移至 HTTPS,并禁用所有 HTTP 访问。换句话说,使用 SSL 保护您的整个站点。这里有更多关于这样做的资源:如何防范 Firesheep站点范围 SSL 的优缺点为什么 SSL 能防范 Firesheep

  • 在所有 cookie 上设置 SECURE 标志:每当服务器设置 cookie 时,安排它在 cookie 上设置 SECURE 标志。SECURE 标志告诉用户的浏览器仅通过 SSL 安全 (HTTPS) 连接发回此 cookie;浏览器永远不会通过未加密 (HTTP) 连接发送 SECURE cookie。最简单的步骤是在您网站使用的每个 cookie 上设置此标志。

另外,我推荐一些额外的步骤:

  • 小心第三方内容:第三方小部件、库和内容可能存在安全风险。如果您包含来自第三方的 Javascript(例如,通过<SCRIPT SRC=...>),我建议您确保它们引用 HTTPS URL;否则,您将网站的安全性暴露在主动攻击之下。(另请参阅Jeremiah Grossman 关于第三方小部件的常见问题解答。)为避免混合内容警告淹没您的用户,您需要确保所有内容(包括第三方图像和库)也通过 HTTPS 传递。

有些人可能会争辩说,以上是矫枉过正。在某些情况下,可以通过仅在部分站点上使用 SSL 来防止 Firesheep。然而,这样做需要细心和详细的知识,而且要做到正确也比较棘手。鉴于您必须在这里提出问题,我个人建议您从站点范围的 SSL 开始;你有更好的机会做对。

如何在 IIS 中实现这一点:我不是 IIS 专家,因此我无法为您提供有关如何在 IIS 中实现这些步骤的明确秘诀。但是,此关于在 IIS启用 SSL 的参考资料可能对您有用。听起来您可以右键单击站点根目录,选择Properties,单击Directory Security选项卡,然后在 中Secure Communications,单击Edit并启用Require Secure Channel (SSL)我不知道如何配置 IIS 以在所有 cookie 上自动设置 SECURE 标志。对于迁移现有站点,我建议您设置重定向,以便任何访问 HTTP 页面的人都被重定向到 HTTPS。以下参考资料可能对此有所帮助(未经测试):重定向到 HTTPS重定向到 HTTPS 的三种方法. 如果迁移现有站点,您还需要将指向您站点的所有链接和引用从http:URL 更改为https:URL。我不确定如何配置 ASP.NET 以在所有 cookie 上设置 SECURE 标志,但我认为您可以添加cookieRequireSSL="true"或添加<httpCookies requireSSL="true">到您的Web.config; 这很重要,如果您启用了 HTTP 或者您有某种从 HTTP 页面到 HTTPS 页面的重定向,则尤其重要。最后,还有很多关于 HTTPS 性能调优的资料。

我在解决自己的问题时遇到了这个线程。我的解决方案是 cookie 路径区分大小写。这是相关的问题。

https://stackoverflow.com/questions/399982/why-are-cookie-paths-case-sensitive

我的决定是从登录页面重定向到正确的路径。请务必注意可能的重定向循环。

url.com/VirtualDirectory/default.aspx ->

//现在将给出正确的路径url.com/virtualdirectory/default.aspx response.redirect("~/default.aspx");