【问题标题】:PHP, MYSQL - Token-based Authentication: what if someone stole my token?PHP、MYSQL - 基于令牌的身份验证:如果有人偷了我的令牌怎么办?
【发布时间】:2020-04-19 07:57:21
【问题描述】:


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

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

到这里为止,一切都很好。
但是,如果黑客等第三方因素成功窃取了用户的令牌 cookie 怎么办?
然后黑客将获得对用户帐户的完全访问权限。
我对吗?如果我是对的,那么如何预防呢?如果可以的话……

谢谢!

【问题讨论】:

    标签: php jwt


    【解决方案1】:

    简短的回答是,您无法完全阻止某人拦截身份验证令牌。 (该类型攻击的某些版本称为Replay Attack)。但是,您可以采取一些措施来减轻如果有人确实设法窃取了令牌可能造成的损害(这些可能是您注意到在其他网站上发生的事情)。 p>

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

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

    一些网络应用会显示为您的用户颁发了多少身份验证令牌。谷歌在这方面做得很好:您可以查看其他设备上的其他登录信息(通常连同有关用户代理和 IP 地址位置的一些信息),因此您更容易注意到那里是否有一个奇怪的令牌,以及重要的问题是它可以让你注销那些其他令牌。

    还有一些“更模糊”的保护可以通过应用程序级防火墙来完成。他们可能会做一些事情,比如评估请求的 IP 地址或用户代理,如果“同一”用户可疑地从 2 个截然不同的 IP 地址或浏览器发送相同的令牌,防火墙可能会记录错误或采取其他某种预防措施行动。

    【讨论】:

    • 谢谢!我想通过 PHP cURL(发布或获取)在每个请求中传递令牌的想法。这个想法是在 cURL 请求中传递令牌并获得响应。这样我就不必将令牌保存在 cookie 中,而且我看不到黑客找到秘密令牌的方法(在唯一的情况下需要使用令牌,直到用户退出选项卡的浏览器网站)。我对吗?再次感谢!
    • 您将总是必须在每个请求和响应中发送令牌(请记住:网络是无状态的)。当您将令牌作为 cookie 发送时,您只是在专用于 cookie 的 HTTP 标头中发送它(请参阅developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Cookies)。如果您在其他自定义标头中或作为 URL 参数发送标头,从安全角度来看没有显着差异:如果黑客正在嗅探您的流量,假设他们可以看到您的完整请求/响应及其标头。
    猜你喜欢
    • 2016-01-29
    • 2012-03-19
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多