Security 如何防止嵌入到我的网页的请求?
我有一个网页,在我的用户访问该网页时跟踪他们。这是一个“个人资料页面”,如果有人访问你的“个人资料页面”,他的访问将被跟踪,并通知你 这与跟踪纵断面图类似(尽管细节不同)。每当一个独特的访问者访问您的配置文件页面时,配置文件视图计数器将递增 我使用存储在浏览器cookie中的随机生成的令牌对用户进行身份验证。这就是我遇到的一个大问题,因为任何随机网站都可以代表我的用户简单地访问该网页,而他们却不知道。例如,攻击者的网页可能只是有一个指向我的网页的嵌入iframe或图像:Security 如何防止嵌入到我的网页的请求?,security,web-applications,cookies,csrf,Security,Web Applications,Cookies,Csrf,我有一个网页,在我的用户访问该网页时跟踪他们。这是一个“个人资料页面”,如果有人访问你的“个人资料页面”,他的访问将被跟踪,并通知你 这与跟踪纵断面图类似(尽管细节不同)。每当一个独特的访问者访问您的配置文件页面时,配置文件视图计数器将递增 我使用存储在浏览器cookie中的随机生成的令牌对用户进行身份验证。这就是我遇到的一个大问题,因为任何随机网站都可以代表我的用户简单地访问该网页,而他们却不知道。例如,攻击者的网页可能只是有一个指向我的网页的嵌入iframe或图像: <img src=
<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">
图像标记的src
实际上不是图像文件,但浏览器仍会发出请求并显示空图像:
这意味着攻击者刚刚代表用户成功地向发出请求,很可能用户根本不知道
如中所述,我们可以添加一些隐藏的输入字段和一个表单,说明“您确定要请求此页面吗?”。缺点是,每个请求页面的真正用户现在都需要单击按钮Yes,Confirm Request page(是,确认请求页面),然后才能访问该页面,这将严重破坏可用性我不想强制用户为每个进行跟踪的页面单击确认。
是否有其他更方便用户的方法来阻止CSRF get请求
如果某个域是嵌入式页面(浏览器的url栏没有显示请求的页面,这意味着它是嵌入式图像、框架、iframe等),我们如何告诉浏览器不要从该域请求页面?这里有一种方法应该相当简单可靠:
- 不要计算对页面的请求,而是计算页面上某个对象的请求(例如AJAX请求和/或对页面上图像的请求)。这将解决
hacks问题,因为浏览器实际上不会尝试将HTML页面呈现为图像,因此不会在页面上运行任何JavaScript或加载任何(子)图像img
- 向页面添加标题,这样浏览器也不会在
中呈现它。对于较旧的浏览器(或者只是皮带和吊杆方法的一部分),您还可以在发送AJAX确认之前让JavaScript检查这一点iframe
- 最后,为了防止被欺骗的(AJAX/image)请求,请包含一个唯一的、不可预测的令牌,该令牌在每个请求中仅有效一次。一种方法是随机生成令牌并将其保存在数据库(或会话存储)中,直到它们被接收回来(或变得太旧) 或者,如果您不想将令牌存储在数据库中,您可以计算时间戳的长度(例如,用户的IP地址)并随请求一起发送,而不考虑任何具有错误MAC或过时时间戳的请求
X-Frame-Options
,但不需要:只要您发送text/html
(或text/anything
)内容类型,浏览器就不会尝试将页面呈现为图像。他们仍然需要在找到内容类型之前请求它,但是,X-Frame-Options
也是如此。最好保持URL漂亮。。。我的整个网站根本不使用JavaScript/frames/iframes。如果你不想使用JavaScript,你也可以在你想要跟踪的页面上放一个小图片(本质上是一个本地的“web bug”),并统计对该图片的请求。图像URL将是丑陋的(因为它需要包含令牌),但同样,用户将永远看不到它。或者您可以将这两种方法结合起来,将图像包装在
标记中,并在JS可用的地方使用AJAX方法。