登录/会话 cookie、Ajax 和安全性
Posted
技术标签:
【中文标题】登录/会话 cookie、Ajax 和安全性【英文标题】:Login/session cookies, Ajax and security 【发布时间】:2010-10-14 06:42:43 【问题描述】:我正在尝试为基于 ajax 的登录表单确定最安全的方法来验证和设置客户端 cookie。我见过这样的关于 XSS 攻击的事情:
How do HttpOnly cookies work with AJAX requests?
和
http://www.codinghorror.com/blog/archives/001167.html
所以,我想我的核心问题是……
1)是否使用纯ajax设置cookies安全,如果是,最安全的方法是什么(httpOnly + SSL +加密值等)?
2) 纯ajax 方法是否涉及设置cookie 客户端?这完全安全吗?
3) 以这种方式设置 cookie 在所有主要浏览器/操作系统上是否可靠?
4) 使用隐藏的 IFrame 会更安全(调用网页设置 cookie)吗?
5) 如果可能的话,有没有人有这方面的代码(php 是我的后端)?
我的目标是设置 cookie 并让它们在下次调用服务器时可用,而无需离开页面。
我真的很想达成共识,这是最安全的方法。最终,此代码计划开源,因此请不要使用商业代码(或任何经不起公众审查的代码)
谢谢, -托德
【问题讨论】:
【参考方案1】:cookie 需要在服务器端生成,因为会话将客户端绑定到服务器,因此令牌交换必须在某个阶段从服务器到客户端。在客户端生成 cookie 并没有真正的用处,因为客户端是不受信任的远程机器。
可以在 AJAX 调用期间设置 cookie。对于服务器(和网络)来说,AJAX 调用只是一个 HTTP 调用,服务器的任何 HTTP 响应都可以设置一个 cookie。所以是的,可以启动会话以响应 AJAX 调用,并且 cookie 将由客户端正常存储。
因此,您可以使用 AJAX 进行登录过程,就像您依赖页面上的表单中的 POST 一样。服务器将以相同的方式查看它们,如果服务器设置了 cookie,浏览器将存储它。
基本上,客户端 javascript 永远不需要知道 cookie 的值(如果不知道,则安全性会更好,这可以使用最近浏览器支持的“httponly”cookie 扩展来实现) .请注意,从客户端到服务器的进一步 HTTP 调用,无论是普通页面请求还是 AJAX 请求,都将自动包含该 cookie,即使它被标记为 httponly 并且浏览器支持该扩展名。您的脚本不需要知道 cookie。
您提到使用 HTTPS(基于 SSL 的 HTTP)——它可以防止其他人读取传输中的信息或冒充服务器,因此对于防止密码或其他重要信息的纯文本传输非常方便。它还可以帮助防范基于网络的攻击,尽管它不会让你对 CSRF 可能给你带来的一切免疫,而且它根本不能保护你免受会话固定或 XSS 之类的攻击。因此,如果您使用 HTTPS,我会避免将其视为万能的:您仍然需要警惕跨站点脚本和跨站点请求伪造。
(参见 1。我将它们组合在一起)
鉴于 cookie 是由服务器在其 HTTP 响应标头中设置的,是的,它是可靠的。但是,为了使其跨浏览器兼容,您仍然需要确保在 AJAX 不可用时可以登录。这可能需要实现仅在没有 Javascript 或 AJAX 不可用时才能看到的替代方案。 (注意:现在是 2014 年,您无需再担心浏览器对 AJAX 的支持)。
它不会改变安全性。不需要它,除了我之前曾见过隐藏的 iframe 用于“模拟”AJAX - 即对服务器进行异步调用。基本上不管你怎么做都无所谓,是服务器设置了cookie,不管是不是AJAX,客户端都会接受并返回cookie。
在大多数情况下,无论您是否使用 AJAX 都不会影响安全性,因为所有真正的安全性都发生在服务器端,并且对服务器而言,AJAX 调用就像非 AJAX 调用:不是值得信赖。因此,您需要注意诸如session fixation 和login CSRF 之类的问题,以及影响整个会话的问题,例如CSRF 和XSS,就像您不使用AJAX 时一样。使用 AJAX 时这些问题并没有真正改变,除了我猜,如果您不太熟悉某项技术或者它更复杂,您可能会在使用该技术时犯更多错误。
答案于 2014 年 9 月更新
【讨论】:
谢谢,这个回复正是我想要的——体贴入微,简直棒极了。我很感激。 - 托德以上是关于登录/会话 cookie、Ajax 和安全性的主要内容,如果未能解决你的问题,请参考以下文章