2

我有一个网页,可以在用户访问该页面时跟踪他们。这是一个“个人资料页面”,如果有人访问您的“个人资料页面”,他的访问将被跟踪并通知您。

这类似于stackoverflow 的个人资料页面,它跟踪个人资料视图(尽管细节不同)。每当唯一身份访问者访问您的个人资料页面时,个人资料查看次数计数器都会增加。

我使用存储在浏览器 cookie 中的随机生成的令牌对用户进行身份验证。这就是我有一个很大的CSRF问题的地方,因为任何随机网站都可以简单地代表我的用户访问该网页,而他们不知道。例如,攻击者的网页可以简单地嵌入一个指向我的网页的 iframe 或图像:

<img src="http://mysite.com/profile-page">

or

<iframe src="http://mysite.com/profile-page"></iframe>

每当我的用户访问攻击者的网页时,他们会在不知情的情况下访问某人的个人资料页面(然后记录访问)。

让我用一个具体的例子来说明我的观点:

如今,许多网站都允许用户发布图片 URL。用户可以发布这样的图像:

 <img src="https://stackoverflow.com/users/632951/pacerier">

image 标签的src确实不是图像文件,但浏览器仍然会发出请求并显示一个空图像:

在此处输入图像描述

这意味着攻击者刚刚成功地代表用户向https://stackoverflow.com/users/632951/pacerier发出请求,很可能在用户不知情的情况下。

正如防止 CSRF 和 XSRF 攻击中提到的,我们可以添加一些隐藏的输入字段和一个显示“您确定要请求此页面吗?”的表单。缺点是每个请求页面的真正用户现在都需要单击按钮Yes, Confirm Request Page才能访问该网页,这将严重破坏可用性。我不想强迫用户点击 Confirm 每个进行跟踪的页面。

还有其他更用户友好的方法来阻止 CSRF 获取请求吗?

如果它是嵌入式页面,我们如何告诉浏览器不要从域http://mysite.com请求页面(浏览器的 url 栏没有显示请求的页面,这意味着它是嵌入式图像、框架、iframe 等) ?

4

1 回答 1

2

这是一种应该相当简单和可靠的方法:

  • 不要计算对页面发出的请求而是由页面的某些东西发出的请求(例如 AJAX 请求和/或对页面上的图像的请求)。这将img解决黑客问题,因为浏览器实际上不会尝试将 HTML 页面呈现为图像,因此不会运行任何 JavaScript 或在页面上加载任何(子)图像。

  • 向页面添加X-Frame-Options: DENY标题,以便浏览器不会在iframe其中呈现它。对于较旧的浏览器(或只是作为腰带和吊带方法的一部分),您还可以window.parent == window在发送 AJAX 确认之前让您的 JavaScript 进行检查。

  • 最后,为了保护您确实计数的(AJAX / 图像)请求免受欺骗,请包含一个唯一的、不可预测的令牌,该令牌在每个请求中仅有效一次。一种方法是随机生成令牌并将它们保存在数据库中(或会话存储中),直到它们被接收回来(或变得太旧)。

    或者,如果您不想将令牌存储在数据库中,您可以计算时间戳的MAC(以及例如用户的 IP 地址)并将两者与请求一起发送,使用错误的 MAC 或过时的时间戳打折任何请求.

于 2013-06-04T14:52:22.857 回答