ajax - 登录/ session cookie、Ajax 和安全性

标签 ajax cookies security

我正在尝试确定基于 ajax 的登录表单的最安全方法来验证和设置客户端 cookie。我见过这样的 XSS 攻击:

How do HttpOnly cookies work with AJAX requests?

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

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

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

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

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

4) 使用隐藏的 IFrame 会更安全吗(调用网页来设置 cookie)?

5)如果可能的话,有人有这方面的代码吗(PHP 是我的后端)?

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

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

谢谢, -托德

最佳答案

  1. cookie 需要在服务器端生成,因为 session 将客户端绑定(bind)到服务器,因此 token 交换必须在某个阶段从服务器到客户端。在客户端生成 cookie 并没有多大用处,因为客户端不受信任的远程计算机。

    可以在 AJAX 调用期间设置 cookie。对于服务器(和网络)来说,AJAX 调用只是一个 HTTP 调用,服务器的任何 HTTP 响应都可以设置 cookie。所以是的,可以启动一个 session 来响应 AJAX 调用,并且 cookie 将由客户端正常存储。

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

    基本上,客户端 Javascript 永远不需要知道 cookie 的值(如果不知道的话,安全性会更好,这可以使用最新浏览器支持的“httponly”cookie 扩展来实现) 。请注意,从客户端到服务器的进一步 HTTP 调用,无论是普通页面请求还是 AJAX 请求,都将自动包含该 cookie,即使它被标记为 httponly 并且浏览器也支持该扩展。您的脚本不需要“了解”cookie。

    您提到使用 HTTPS(基于 SSL 的 HTTP)——可以防止其他人读取传输中的信息或冒充服务器,因此它对于防止密码或其他重要信息的纯文本传输非常方便。它还可以帮助防范基于网络的攻击,尽管它并不能让您免受 CSRF 可能引发的所有攻击,而且它根本无法保护您免受 session 固定或 XSS 之类的攻击。因此,如果您使用 HTTPS,我会避免将其视为万能药:您仍然需要对跨站点脚本和跨站点请求伪造保持警惕。

  2. (参见 1。我将它们组合起来)

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

  4. 它不会改变安全性。没有必要,除了我之前见过使用隐藏的 iframe 来“模拟”AJAX - 即对服务器进行异步调用。基本上,无论你怎么做都没关系,服务器设置cookie,客户端无论是否通过AJAX 都会接受并返回cookie。

在大多数情况下,无论您是否使用 AJAX 都不会影响安全性,因为所有真正的安全性都发生在服务器端,并且对于服务器来说,AJAX 调用就像非 AJAX 调用:不是值得信赖。因此,您需要注意诸如 session fixation 之类的问题。和 login CSRF以及影响整个 session 的问题,例如 CSRFXSS就像您不使用 AJAX 时一样。使用 AJAX 时,这些问题并没有真正改变,除非,我猜,如果您不太熟悉某项技术或者它更复杂,您可能会在使用该技术时犯更多错误。

答案更新于 2014 年 9 月

关于ajax - 登录/ session cookie、Ajax 和安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/661599/

相关文章:

javascript - 在 html 中显示 AJAX 响应

javascript - 主干同步覆盖,附加 url 与查询字符串?

javascript - 如何过滤显示的 JSON 文件

R httr 认证后下载在交互模式下工作但功能失败

javascript - socket.io 套接字 ID 应该保密吗?

php - 将数据从ajax传递到php

javascript - 在 Ajax 请求上设置 Cookie 到外部域

javascript - 记住从自动创建的 JS 数组中选择(通过 Cookie)选项(取决于用户的选择)

rest - 有没有办法保护公共(public)端点?

django - 将我的代码发布到 github 会影响我的应用程序的安全性吗?