我正在编写一个Web应用程序,它将通过AJAX发出请求,并希望锁定这些调用.经过一番研究,我正在考虑使用某种形式的随机令牌(字符串)与请求一起传回(GUID?).这是我的算法的重要部分:
将标记分配给JavaScript变量(生成的服务器端).
此外,将该令牌存储在DB中并为其提供有效的时间段(即10分钟).
如果令牌仍未使用且在其有效时间窗口内,请允许该呼叫.
如果有效则返回请求的信息,否则,请记录请求并忽略它.
着眼安全,这有意义吗?对于令牌,GUID是否有效 - 是否应该是其他内容?有没有一种好方法来加密请求中的变量?
编辑:
我知道这些AJAX请求不会真正"安全",但我想添加基本安全性,因为我想阻止其他人使用我打算编写的服务.这个随机令牌将是针对滥用呼叫的基本前线防御.将要求(甚至提交以生成此类数据)的数据极不可能重复.
也许我在使用GUID时错了......随机生成的字符串(令牌)怎么样?
如果您这样做是为了信任您发送到客户端浏览器的代码,那么改变方向.您真的不想信任用户输入,其中包括您发送到浏览器的js的调用.应该在服务器上建立逻辑,这样就不会有任何错误.也就是说,asp.net使用签名字段,如果绝对必要,你可能想要这样做.
扩展一点:Asp.net防篡改viewstate,它作为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默认验证viewstate的原因是因为开发人员依赖于那里的信息,因为只有应用程序才会处理这些信息.同样可能适用于您的场景,不要依赖此机制.如果您想评估某人是否可以做某事,请使用身份验证+授权.如果您想知道ajax调用仅发送有效选项,请验证它们.不要以可以适当授权操作的粒度级别公开API.这种机制只是一种额外的措施,以防万一滑倒,而不是真正的保护.
PS.使用上面的HMACSHA1,您可以使用固定密钥对其进行实例化