PHP,MYSQL-基于令牌的身份验证:如果有人偷了我的令牌怎么办?

PHP,MYSQL-基于令牌的身份验证:如果有人偷了我的令牌怎么办?,php,jwt,Php,Jwt,我试图了解我是否正确理解“基于令牌的身份验证”的使用。 例如,假设我有一个登录表单,我想验证一个用户。 该系统基于HTML、PHP和MySQL数据库。 过程: 1.用户键入用户名和密码并将其发送到服务器。 2.如果详细信息正确,服务器(PHP)将签入数据库中的“用户”表。 3.如果详细信息正确,服务器将创建一个秘密令牌并将其插入数据库中的“auth_token”表中。 4.保存在cookie中的秘密令牌,用户在每个HTTP请求中传递该令牌以获得访问权。 在这里之前,一切都很好。 但是,如果像黑客


我试图了解我是否正确理解“基于令牌的身份验证”的使用。
例如,假设我有一个登录表单,我想验证一个用户。
该系统基于HTML、PHP和MySQL数据库。

过程:
1.用户键入用户名和密码并将其发送到服务器。
2.如果详细信息正确,服务器(PHP)将签入数据库中的“用户”表。
3.如果详细信息正确,服务器将创建一个秘密令牌并将其插入数据库中的“auth_token”表中。
4.保存在cookie中的秘密令牌,用户在每个HTTP请求中传递该令牌以获得访问权。

在这里之前,一切都很好。
但是,如果像黑客这样的第三方因素成功地从用户那里窃取了令牌cookie怎么办?
然后黑客将获得对用户帐户的完全访问权。
我说得对吗?如果我是对的,那么如何预防呢?如果可能的话…


谢谢

简而言之,您无法完全阻止某人拦截身份验证令牌。(这种类型的攻击的某些版本称为a)。然而,如果有人试图窃取代币,你可以做一些事情来减轻损失(这些可能是你在其他网站上注意到的事情)

一件简单的事情是,在用户做任何太严重的事情之前,网站会要求用户重新验证。例如,在更改电子邮件或密码之前,可能会再次询问您的密码。尽管攻击者可能偷了您的令牌,但他们也不太可能知道您的凭据(特别是当站点使用双因素身份验证时),因此您可以通过在某些关键步骤之前提示用户重新身份验证来减少损失

对于更安全的系统,令牌会在每次请求后更新,以便无法重放。对于应用程序来说,这是更多的工作,因为它必须验证传入的令牌,然后为每个请求/响应签名并返回一个新令牌。问题是,如果攻击者能够窃取您的令牌,并且他们在您之前提交请求,那么他们的请求将被接受,并且您的请求将失败(!),因为对于服务器来说,您的请求看起来就像复制猫。但是,如果发生这种情况,您可以重新登录,并希望引导任何其他登录到您帐户的令牌(接下来将详细介绍)

一些web应用程序将向您显示已为您的用户颁发了多少身份验证令牌。谷歌在这方面做得很好:你可以查看其他设备上的其他登录(通常还有一些关于用户代理和IP地址位置的信息),这样你就更容易注意到其中是否有奇怪的令牌,重要的是它允许你注销其他令牌


还有“模糊”保护,可以通过应用程序级防火墙实现。他们可能会评估请求的IP地址或用户代理,如果“同一”用户可疑地从两个截然不同的IP地址或浏览器发送相同的令牌,防火墙可能会记录错误或采取其他预防措施。

谢谢!我想到了一个主意,通过PHP cURL(post或get)在每个请求中传递令牌。其思想是在cURL请求中传递令牌并获得响应。这样我就不必将令牌保存在cookie中,我也看不到黑客找到秘密令牌的方法(只有在用户退出网站选项卡的浏览器之前,才需要使用令牌)。我说得对吗?再次感谢!您将始终必须在每个请求和响应中发送令牌(请记住:web是无状态的)。当您将令牌作为cookie发送时,您只需在专用于cookie的HTTP头中发送它(请参阅)。从安全角度来看,如果您在其他自定义头中发送头或作为URL参数发送头,则没有显著区别:如果黑客正在嗅探您的流量,则假定他们可以看到您的完整请求/响应及其头。