小编典典

登录/会话cookie,Ajax和安全性

ajax

我正在尝试确定基于ajax的登录表单进行身份验证和设置客户端cookie的最安全方法。

http://www.codinghorror.com/blog/archives/001167.html

所以,我想我的核心问题是…

1)使用纯Ajax设置cookie是否安全,如果是,最安全的方法是什么(httpOnly + SSL +加密值等)?

2)纯ajax方法是否涉及设置cookie客户端?这绝对安全吗?

3)以这种方式设置cookie在所有主要浏览器/操作系统上是否可靠?

4)使用隐藏的iframe是否会更安全(调用网页设置cookie)?

5)如果可能,是否有人对此有代码(PHP是我的后端)?

我的目标是设置cookie,并使它们可用于下一次对服务器的调用,而无需离开页面。

我真的很想确定达成共识的最安全方法。最终,该代码计划被开源。因此,请不要使用商业代码(或任何经不起公众审查的代码)

谢谢-托德


阅读 305

收藏
2020-07-26

共1个答案

小编典典

  1. cookie必须在服务器端生成,因为会话将客户端绑定到服务器,因此令牌交换必须在某个阶段从服务器到客户端。生成cookie客户端并不会真正有用,因为该客户端 不受信任的远程计算机。

可以在AJAX调用期间设置cookie。对于服务器(和网络),AJAX调用只是一个HTTP调用,服务器的任何HTTP响应都可以设置cookie。因此,可以,可以响应AJAX调用而发起会话,并且该cookie将由客户端正常存储。

因此,您可以使用AJAX进行登录过程,就像通过页面上的表单依靠POST一样。服务器将以相同的方式查看它们,如果服务器设置了cookie,浏览器将对其进行存储。

基本上,客户端Javascript永远不需要能够知道cookie的值(如果不这样做,则对安全性更好,这可以使用最近的浏览器认可的“ httponly”
cookie扩展来实现)。请注意,无论是正常的页面请求还是AJAX请求,从客户端到服务器的其他HTTP调用都将自动包含该cookie,即使其标记为httponly并且浏览器采用该扩展名也是如此。您的脚本不需要“了解”
cookie。

您提到使用HTTPS(基于SSL的HTTP)-防止其他人在传输过程中读取信息或模拟服务器,因此对于防止密码或其他重要信息的纯文本传输非常方便。它也可以帮助您防范基于网络的攻击,尽管它不能使您免受CSRF可能给您带来的一切困扰,也不能完全保护您免受会话固定或XSS之类的攻击。因此,如果您使用HTTPS,我会避免将其视为固定解决方案:您
仍然 需要对跨站点脚本和跨站点请求伪造保持警惕。

  1. (请参阅1.我将它们组合在一起)

  2. 假定cookie是由服务器在其HTTP响应标头中设置的,是的,它是可靠的。但是,要使其跨浏览器兼容,您仍然需要确保在AJAX不可用时可以登录。这可能需要实现一种替代方法,该替代方法仅在没有Javascript或AJAX不可用时才可见。( 注意:现在是2014年,您不再需要担心浏览器对AJAX的支持了 )。

  3. 它不会改变安全性。除了我之前看到过用来“模拟” AJAX的隐藏iframe(即对服务器进行异步调用)之外,将不需要它。基本上,但是您没关系,这是由服务器设置Cookie,并且无论是否通过AJAX进行操作,客户端都会接受并返回Cookie。

在大多数情况下,无论是否使用AJAX都不会对安全性造成太大的影响,因为所有真正的安全性都发生在服务器端,并且对服务器而言,AJAX调用就像非AJAX调用一样:不可信任。因此,与不使用AJAX时一样,您需要意识到诸如会话固定登录CSRF之类的问题,以及像CSRFXSS这样影响整个会话的问题。使用AJAX时,这些问题并没有真正改变,除了,我想,如果您对某项技术不熟悉或比较复杂,则可能会犯更多的错误。

答案于2014年9月更新

2020-07-26