那么,对于 GAE 应用程序来说,防止 XSRF 攻击的最佳方法是什么?想象一下:
- 任何人都可以看到用户的公共对象,并且在请求中使用 db.Model id 来确定要显示的对象。恶意用户现在拥有该 ID。
- 恶意用户创建自己的对象并签出删除表单。他们现在知道如何删除具有特定 id 的对象。
- 恶意用户让无辜用户提交对该用户对象的删除请求。
我可以添加哪些步骤来防止#3?请注意,当我说 ID 时,我使用的是密钥的实际 ID 部分。我的一个想法是在删除请求中使用完整的键值,但这会阻止恶意用户解决这个问题吗?据我所知,密钥是模型类类型、应用程序 ID 和对象实例 ID 的某种组合,因此如果他们愿意,他们可能会从 id 派生密钥。
还有其他想法吗?Jeff 写了一篇关于这个的帖子,并提出了一些方法——一个隐藏的表单值,它会在每次请求时改变,以及一个通过 js 写入表单的 cookie 值。我不想排除非 javascript 用户,因此 cookie 解决方案不好 - 对于隐藏的表单值,我必须对显示可删除对象的每个请求进行数据存储写入 - 对于可扩展的对象来说,这不是理想的情况应用程序!
还有其他想法吗?