6

我正在编写一个将通过 AJAX 发出请求并希望锁定这些调用的网络应用程序。经过一番研究,我正在考虑使用某种形式的随机令牌(字符串)与请求(GUID?)一起传回。这是我算法的重要部分:

  1. 将令牌分配给 JavaScript 变量(在服务器端生成)。
  2. 此外,将该令牌存储在数据库中并为其指定一个有效时间段(即 10 分钟)。
  3. 如果令牌仍未使用并且在其有效时间窗口内,则允许调用。
  4. 如果有效则返回请求的信息,否则,记录请求并忽略它。

着眼于安全,这有意义吗?对于令牌,GUID 会起作用吗?它应该是别的东西吗?有没有一种加密请求中变量的好方法?

编辑:

我知道这些 AJAX 请求并不是真正的“安全”,但我想添加基本的安全性,因为我想阻止其他人使用我打算编写的服务。这种随机令牌将是防止滥用电话的基本前线防御。将被请求(甚至提交以生成此类数据)的数据极不可能重复。

也许我在使用 GUID 时错了……随机生成的字符串(令牌)怎么样?

4

3 回答 3

5

如果您这样做是为了信任您发送到客户端浏览器的代码,请更改方向。您真的不想信任用户输入,其中包括您发送到浏览器的来自 js 的调用。应该在服务器上建立逻辑,这样就不会发生任何错误。也就是说,asp.net 使用签名字段,如果绝对必要,您可能希望采用这种方式。

扩展一点:Asp.net 防篡改视图状态,它作为 html 隐藏字段发送(取决于配置)。我确信有更好的链接作为参考,但至少在这个链接中提到了:http: //msdn.microsoft.com/en-us/library/ms998288.aspx

验证。这指定了用于生成 HMAC 以使 ViewState 和表单身份验证票证防篡改的散列算法。此属性还用于指定用于 ViewState 加密的加密算法。此属性支持以下选项:

  • SHA1–SHA1 用于防篡改 ViewState,如果已配置,还用于表单身份验证票证。当为验证属性选择 SHA1 时,使用的算法是 HMACSHA1。

该算法的 .net 类链接http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.hmacsha1.aspx

更新 2: 为了防篡改,您希望对数据进行签名(而不是对其进行加密)。请注意,通常在使用密码学时,您应该真正避免使用自定义实现或算法。关于步骤,我会坚持:

  • 将令牌分配给 JavaScript 变量(在服务器端生成)。您包括信息以识别请求以及发出请求的确切日期和时间。签名将验证服务器端应用程序发布的数据。
  • 如果合适,确定重复提交。

也就是说,asp.net 默认验证视图状态的原因是,开发人员依赖传入的信息,因为只有应用程序不应该处理这些信息。这可能适用于您的场景,不要依赖这种机制。如果您想评估某人是否可以做某事,请使用身份验证+授权。如果您想知道 ajax 调用仅发送有效选项,请验证它们。不要在粒度级别公开 API,而不是您可以适当授权操作的 API。这种机制只是一种额外的措施,以防万一发生滑倒,而不是真正的保护。

附言。使用上面的 HMACSHA1,您将使用固定密钥对其进行实例化

于 2009-03-17T02:45:13.613 回答
1

“保护”是一个模糊的术语。你到底想完成什么?使用 GUID 是防止重复提交相同请求的一种非常好的方法,但仅此而已。

如果在客户端和服务器之间传递的信息是真正敏感的,您应该通过 HTTPS 进行。就保护实际通信而言,这确实是唯一的答案。

编辑:回答您关于 GUID 是否是“正确”方式的问题 - 没有正确的方法可以按照您的建议进行操作。使用任何令牌,无论是 GUID 还是您自己创建的东西,除了防止重复提交同一请求外,不会产生任何影响。就是这样。

于 2009-03-17T02:38:06.410 回答
1

这实际上取决于您要通过安全性实现的目标。如果您的意思是防止未经授权使用 HTTP 端点,那么您几乎无能为力,因为用户将拥有对用于进行调用的 HTML 和 JavaScript 的完全访问权限。

如果您的意思是阻止某人嗅探 AJAX 请求中的数据,那么我只会使用 SSL。

以您建议的方式使用的 GUID 实际上只是重新发明了会话 ID cookie。

于 2009-03-17T02:38:11.633 回答