login/会话cookie,Ajax和安全
我试图确定一个基于ajax的login表单的最安全的方法来validation和设置客户端cookie。 我已经看到了有关XSS攻击的事情,例如:
HttpOnly cookies如何处理AJAX请求?
和
http://www.codinghorror.com/blog/archives/001167.html
所以,我想我的核心问题是…
1)是使用纯Ajax来设置cookie安全,如果是的话,什么是最安全的方法(httpOnly + SSL +encryption值等)?
2)纯ajax方法是否涉及到设置cookie客户端? 这完全安全吗?
3)在所有主stream浏览器/操作系统中设置cookie是否可靠?
4)将使用隐藏的IFrame更安全(调用网页来设置Cookie)?
5)如果可能的话,有没有人有这个代码(PHP是我的后端)?
我的目标是设置cookie,并让它们可用于下一次呼叫服务器,而无需离开页面。
我真的想确定达成共识,最安全的方式来做到这一点。 最终,这个代码计划成为开放源代码,所以请不要使用任何商业代码(或者任何经不起公共审查的东西)
谢谢,托德
-
Cookie需要在服务器端生成,因为会话将客户端绑定到服务器,因此令牌交换必须在某个阶段从服务器到客户端。 生成cookie客户端并不是很有用,因为客户端是不可信的远程机器。
在AJAX调用期间可以设置cookie。 对服务器(和networking)来说,AJAX调用只是一个HTTP调用,服务器的任何HTTP响应都可以设置一个cookie。 所以是的,可以启动一个会话来响应AJAX调用,并且Cookie将被客户端正常存储。
所以,你可以使用AJAX来进行login过程,就像你可以只依靠页面上的一个表单的POST一样。 服务器将以同样的方式看到它们,如果服务器设置了cookie,浏览器将会存储它。
基本上,客户端Javascript永远不需要能够知道cookie的价值(如果不这样做,安全性更好),这可以使用最近浏览器的“httponly”cookie扩展来实现。 请注意,从客户端到服务器的进一步HTTP调用(无论是正常的页面请求还是AJAX请求)都会自动包含该cookie,即使它被标记为httponly并且浏览器将对该扩展名进行授权。 您的脚本不需要“知道”cookie。
您提到使用HTTPS(基于SSL的HTTP) – 防止他人读取传输中的信息或模拟服务器,所以防止密码或其他重要信息的纯文本传输非常方便。 它也可以帮助防范基于networking的攻击,尽pipe它不能让你免于CSRF可能给你带来的所有问题,而且它也不能保护你免受会话固定或XSS之类的攻击。 所以如果你使用HTTPS,我会避免把HTTPS当成一个修补程序:你仍然需要对跨站点脚本和跨站请求伪造保持警惕。
-
(见1)我把它们合并在一起)
-
鉴于cookie是由HTTP响应头中的服务器设置的,是的,这是可靠的。 但是,为了使其跨浏览器兼容,当AJAX不可用时,仍然需要确保login。 这可能需要实现一个只有在没有Javascript或AJAX不可用时才能看到的替代方法。 ( 注意:现在在2014年,您不必担心浏览器对AJAX的支持了 )。
-
这不会改变安全。 除了我已经看到之前用来模拟AJAX的隐藏的iframe之外 – 也就是说,对服务器进行asynchronous调用。 基本上,不pipe你做什么都没关系,它是设置cookie的服务器,客户端将接受并返回cookie,不pipe它是否通过AJAX。
大多数情况下,无论您使用AJAX,都不会影响安全性,因为所有真正的安全性都发生在服务器端,对于服务器来说,AJAX调用就像非AJAX调用一样:不可信。 因此,您需要了解会话固定和loginCSRF等问题,以及像CSRF和XSS一样影响整个会话的问题,就像您不使用AJAX一样。 使用AJAX时,这些问题并没有真正改变,除了我猜测,如果你不太熟悉这个技术,或者它更复杂,你可能会犯更多的错误。
答复于2014年9月更新