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,并让它们可用于下一次呼叫服务器,而无需离开页面。

我真的想确定达成共识,最安全的方式来做到这一点。 最终,这个代码计划成为开放源代码,所以请不要使用任何商业代码(或者任何经不起公共审查的东西)

谢谢,托德

  1. 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当成一个修补程序:你仍然需要对跨站点脚本和跨站请求伪造保持警惕。

  2. (见1)我把它们合并在一起)

  3. 鉴于cookie是由HTTP响应头中的服务器设置的,是的,这是可靠的。 但是,为了使其跨浏览器兼容,当AJAX不可用时,仍然需要确保login。 这可能需要实现一个只有在没有Javascript或AJAX不可用时才能看到的替代方法。 ( 注意:现在在2014年,您不必担心浏览器对AJAX的支持了 )。

  4. 这不会改变安全。 除了我已经看到之前用来模拟AJAX的隐藏的iframe之外 – 也就是说,对服务器进行asynchronous调用。 基本上,不pipe你做什么都没关系,它是设置cookie的服务器,客户端将接受并返回cookie,不pipe它是否通过AJAX。

大多数情况下,无论您使用AJAX,都不会影响安全性,因为所有真正的安全性都发生在服务器端,对于服务器来说,AJAX调用就像非AJAX调用一样:不可信。 因此,您需要了解会话固定和loginCSRF等问题,以及像CSRF和XSS一样影响整个会话的问题,就像您不使用AJAX一样。 使用AJAX时,这些问题并没有真正改变,除了我猜测,如果你不太熟悉这个技术,或者它更复杂,你可能会犯更多的错误。

答复于2014年9月更新