那么,为GAE应用程序防止XSRF攻击的最佳方法是什么?想象一下以下内容:如何在GAE应用程序中最好地防止CSRF攻击?
- 任何人都可以看到该用户的公共对象,并且db.Model ID在请求中使用,以找出哪些对象显示。恶意用户现在拥有该ID。
- 恶意用户创建自己的对象并检出删除表单。他们现在知道如何删除具有特定ID的对象。
- 恶意用户获取无辜用户提交该用户对象的删除请求。
我可以添加哪些步骤来防止#3?请注意,当我说ID时,我正在使用密钥的实际ID部分。我想到的一个想法是在删除请求中使用完整的键值,但会阻止恶意用户能够解决这个问题吗?据我所知,关键是模型类类型,应用程序ID和对象实例ID的一些组合,所以如果他们愿意的话,他们可能会从ID中获得密钥。
还有其他想法吗? Jeff写了a post about this,并提出了几个方法 - 一个会在每个请求中改变的隐藏表单值,以及一个通过js写入表单的cookie值。我不想排除非javascript用户,所以cookie解决方案是不好的 - 对于隐藏的表单值,我将不得不在每个显示可删除对象的请求上执行数据存储写操作 - 这对于可伸缩性来说并不理想应用程序!
有没有其他想法呢?
那么,如果有人通过代理连接到我的网站,并遇到XSRF攻击,他们将不受保护?另外,杰夫提到引用者很容易被欺骗。我知道,作为一名用户,我可以轻松做到这一点,但是网站能否以某种方式让浏览器报告不同的推荐人? – 2008-10-14 13:16:14
只有当代理或浏览器剥离引荐者时,他们才会受到保护。很少这样做,并且通过保护所有你能够保护的人,你使得攻击没有吸引力。 是的,引用者是可伪造的,但攻击者无法通过任何代码说服用户在浏览器中执行代码。 – 2008-10-14 18:22:00
不允许空白Referer标题!如果从HTTPS页面请求HTTP页面,则不会发送[Referer](http://stackoverflow.com/a/1361720/691281)。因此,如果您的表单位于HTTP页面上,攻击者可以使得引用者在CSRF攻击中变为空白。即使您的表单位于HTTPS页面上,我也会非常怀疑空白Referer标头。 – 2013-04-06 17:37:22