保护AJAX应用程序的最佳方法
我目前正在研究基于AJAX的站点的身份验证,并且想知道是否有人对这种事情的最佳实践有任何建议。
我最初的方法是基于cookie的系统。本质上,我使用身份验证代码设置了一个cookie,并且每次数据访问都更改了该cookie。同样,每当身份验证失败时,该用户的所有会话都将被取消身份验证,以阻止劫机者。要劫持会话,必须有人保持登录状态,而黑客则需要发送最新的cookie更新来欺骗会话。
不幸的是,由于AJAX的性质,当快速发出多个请求时,它们可能会恢复正常,将cookie设置为错误,并中断会话,因此我需要重新实现。
我的想法是:
- 一种绝对不太安全的基于会话的方法
- 在整个网站上使用SSL(似乎过分杀伤力)
- 使用经过ssl身份验证的iFrame进行安全交易(我只是有点假设这是可能的,需要进行一些jQuery黑客攻击)
问题不在于正在传输的数据,唯一的问题是有人可能会控制一个不是他们自己的帐户。
一种绝对不太安全的基于会话的方法
解决方案
如果我们在服务器的每个响应上加上"生成的"时间戳,并且AJAX应用程序始终可以使用具有最新时间戳的cookie,该怎么办?
最好的选择是在与Apache和/或者Tomcat进行预先身份验证的连接上使用SSL连接。两者中基于表单的身份验证均具有必需的SSL连接,可为我们提供安全的连接。然后,Web应用程序可以为会话提供安全性和身份,而客户端Ajax不必担心安全性。
必须使用SSL,以防止可能被多个用户使用的透明代理连接。然后,我只需使用已通过身份验证的IP地址来检查传入的IP地址。
重新验证:
- ip地址更改后
- 超过n秒的超时而没有任何请求
- 单独处理任何重要交易
我们可以尝试阅读Billy Hoffman和Bryan Sullivan撰写的《 Ajax Security》一书。我发现它改变了我对安全性的思考方式。对于Ajax的每个阶段都有非常具体的建议。
常见的解决方案是对用户的会话ID进行哈希处理,并将其与每个请求一起传递,以确保该请求来自有效用户(请参见此幻灯片)。从CSRF的角度来看,这是相当安全的,但是如果有人在嗅探数据,则可以将其截获。根据需求,ssl始终是最安全的方法。