0

通过几个线程,我可以看到在用户未经身份验证的站点区域使用 MVC 防伪令牌是过度杀伤力。

我有一个应用程序从site1、site2、site3 等向mysite.com 发布一些信息。每个站点都有一个唯一标识符,该标识符通过异步Javascript POST 在POST 请求中发送。在 site1-3 上执行的 Javascript 在 mysite.com 上生成,然后返回到填充了一些 Javascript 变量的站点。

所以生命周期如下:

  1. site1 上的页面有对 mysite.com 的 Javascript 引用。
  2. 该链接引用指向生成 Javascript 以返回到 site1 的控制器路由。
  3. 返回的 JS 末尾包含一个 POST 请求,该请求返回到 mysite.com,其中包含 URL、浏览器等,以及 site1 上页面访问者的详细信息。

我可以从 JS POST 请求的接受控制器中很好地读取 POST 参数,但是,我想知道是否将防伪令牌添加到参数列表中是否有任何意义。

如果是这样,我将不得不在初始请求中生成它,并将其作为返回给 site1 的 JS 中的 JS 变量传回,然后在第二个请求中将其与表单 POST 一起传回。

由于只有在找到有效帐户时才会在 mysite.com 上进行任何处理,因此进行此操作有什么意义吗?

如果是这样,我将如何在控制器级别生成防伪令牌?

4

1 回答 1

0

我会说这取决于发布的数据的敏感性。如果另一个用户可以通过伪造请求并提交它们来造成伤害(或烦恼),那么我会说这是合适的。听起来您只是在收集一些使用信息,因此不太可能出现这种情况。

一次性随机随机数可能是更好的解决方案。这将使伪造请求和防止错误的多次提交变得困难,例如来自使用缓存副本的用户。在 mysite.com 上生成一个随机值(GUID 可能有效),将其插入数据库并将其标记为未使用。将其与 POST 一起发回。检查它是否已被使用。如果未使用,则将其标记为已使用并执行您的日志记录操作。如果它已被使用,则将该请求作为重复提交丢弃。

请注意,您不需要 POST,带有 URL 参数的简单 GET 就足够了,因为 nonce 将防止它被意外重复。

于 2012-01-02T15:27:20.000 回答