Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 没有httpOnly的Cookie有多不安全?_Javascript_Security_Authentication_Cookies - Fatal编程技术网

Javascript 没有httpOnly的Cookie有多不安全?

Javascript 没有httpOnly的Cookie有多不安全?,javascript,security,authentication,cookies,Javascript,Security,Authentication,Cookies,我正在开发一个web应用程序,它需要设置cookiehttpOnly=false 因为,我找不到其他方法从服务器端传递身份验证cookie(用于检查用户是否已成功登录)以通过我前端的Javascript访问。然后使用此cookie将AJAX请求发送到我的服务器端(添加到头中)。(如果我错了,请纠正我,并提出其他建议) 我的问题: 有多不安全httpOnly=false?只需强制它使用cookieSecureOption=true就足够安全了,这样它将始终通过HTTPS发送 如何保护它免受XSS攻

我正在开发一个web应用程序,它需要设置cookie
httpOnly=false

因为,我找不到其他方法从服务器端传递身份验证cookie(用于检查用户是否已成功登录)以通过我前端的Javascript访问。然后使用此cookie将AJAX请求发送到我的服务器端(添加到头中)。(如果我错了,请纠正我,并提出其他建议)

我的问题:

有多不安全
httpOnly=false
?只需强制它使用
cookieSecureOption=true
就足够安全了,这样它将始终通过HTTPS发送


如何保护它免受XSS攻击?

如果您没有标记HTTPOnly,您的用户仍然比其他情况下更容易受到XSS攻击,因为cookie仍然可以从JavaScript访问。根据您的描述,您不需要从JavaScript访问变量,只需从服务器端访问cookie(这在标记了HTTPOnly的情况下仍然是可能的,cookie随每个请求一起发送,包括AJAX调用)即可检索身份验证信息。安全标志和HTTPOnly标志用于防御完全不同的攻击。

有一种混合方式。我之所以说混合,是因为它涉及到你所做的一半,以及bksi在评论中提到的混合

因为我不知道您的完整场景,这个答案假设您只是在寻找一种方法来验证用户,然后允许他们进行更改或启动流程服务器端;登录、查看帐户页面等。您永远不应该仅仅依赖于httpOnly=false,我建议您将它与下面的内容一起使用

固溶体
当用户成功登录时,设置一个普通cookie,这不需要通过HTTPS发送,尽管这会很好。此cookie应该是为其会话随机生成的令牌。我通常散列(PHP中的md5加密)他们的用户id(假设您使用数据库)和他们登录时的时间戳。这确保令牌是唯一的

现在您已经将令牌作为cookie保存在他们的本地机器上,还请确保将该令牌保存在服务器端的PHP会话中。现在,每当他们访问页面或发送AJAX请求时,您都可以将本地cookie与PHP会话值服务器端进行比较。这是对与服务器交互的用户进行身份验证的最快方法。如果值匹配,则它们是合法的

现在这并不完全安全。本地cookie总是可以编辑的,这是我们通常不太关心的,因为这只会通过使用户的会话无效而伤害用户。另一方面,狡猾的黑客可以改变PHP会话,这可能会使其他用户无效,因为他们的会话被删除或劫持。黑客必须获得一个合法的会话令牌,并制作一个与之匹配的cookie

更好的解决方案
1) 在服务器端,您可以使用数据库而不是PHP会话。这个过程保持不变,但是现在需要做更多的工作来保持数据库中的sessions表是最新的。通常,这是通过使用时间戳保存令牌并在每次检查令牌时更新此时间戳来完成的。如果检查了令牌,并且最后一个时间戳确实很旧(由您决定时间戳的长度),您可以通过销毁用户的本地cookie并让他们再次登录来取消对用户的身份验证。不过,这是一种资源密集型操作,可能会降低流量负载较大的站点的速度

2) 使用双重身份验证的形式。这将在90%的时间里使用PHP会话来处理简单的事情,但当出现一个非常重要的过程时,比如更新个人信息或提供信用卡信息,也要检查数据库。这需要在用户计算机上保存两个不同的cookie。一个if用于检查PHP会话的身份验证,第二个if用于检查数据库。这种情况下,黑客很难突破到更重要的东西,因为他们需要弄清楚令牌和数据库都不容易被窃取

最后的想法
这是一个相当安全的答案,但您仍然应该实施额外的安全预防措施。你似乎误解了饼干的工作原理;你最近的评论听起来像是你在倒退使用cookies和ajax,但也许我误解了。我是这样做的:

[User]-> Tries logging in to website with a login form
[Server]-> Checks this information against the database Pass, log 'em in.
[Server]->  Generate and set a random token as a cookie
我在这里使用PHP,通常使用sessionToken这样的名称来存储这个cookie。这个cookie现在立即存在于用户的计算机上,而我们,服务器,总是可以访问它的服务器端;我们可以随时打电话。但这并不是真正安全的,因为当我们将cookie发送给他们时,人们可以复制cookie而不被人知道/窃取。我马上就来处理

[服务器]->创建具有相同令牌的PHP会话(会话id:abc123)服务器端

这是安全的第一步。PHP会话不容易被窃取或破解。因此,即使有人在我们的用户尝试在他们的计算机上使用令牌cookie时偷走了它,它也会失败。以下是一个有效用户:

[User]-> (PHP session id: abc123) Tries to access secured page or content. PHP session is called up and is checked against the cookie token. If they equal each other this attempt passes.
在这里,用户在他们不知道的服务器上有一个会话,该会话可以识别他们是谁,并且只能由服务器访问;通常这就是AJAX请求发挥作用的地方。每次用户尝试做一些您希望看到他们是否被允许做的事情时,都会通过AJAX向对用户进行身份验证的PHP脚本发送一个请求。它所做的只是发回通过或失败。然后,您可以使用AJAX或Javascript做任何您需要的事情。这是一个黑客exmaple:

[Hacker]-> Steals a cookie from a user over a cafe's wifi.
[Hacker]-> Tries to access the website you are on with it.
[Server]-> (PHP session id: ???) Doesn't have one, destroy the cookie and ask this user (the hacker) to login again.
这是我能提供的尽可能多的信息和帮助。你的最新评论听起来像是你应该在Stackoverflow上发布的新问题。

一个“非HttpOnly cookie”本身并不是一个漏洞

“HttpOnly cookie”可降低风险