我正在使用基于令牌的身份验证来访问我为我的网站设计的一些原始Web API。登录时,用户名和密码将发布到登录API,并生成具有唯一密钥的令牌,密钥将存储在数据库中。在每次后续调用时,令牌随请求一起发送,并在服务器上使用密钥进行验证。
我正在使用网络应用程序来使用此API服务并为用户提供前端。 Web应用程序使用HTML / Bootstrap / JQuery设计,后端使用php编写。
我已成功测试了我的应用,基于令牌的身份验证正常运行。但是,我有一个问题。我发现用户ID和令牌是直接显示的,只能在浏览器的地址栏上使用url编码。
http://hasconpanel.ckoysolutions.com/hasconpanel.php?inputs={%20%22username%22%20:%20%22Debopam%20Parua%22%20,%20%22uid%22%20:%20%2220170520193421DP%22%20,%20%22token%22%20:%20%22Sa2pHyooWPoI79vfvJzLlw7UO%252B2p5hOpBttkEq7LQ%252BjAGm9XEmxfhLAcnJoLbqrsXCp75%252BG1M7nEUoCgsDVbIQ%253D%253D%22%20,%20%22list_of_devices%22%20:%20[{%22device_code%22:%22b8:27:eb:f1:b3:0f%22,%22device_name%22:%22First-Pi%22}]%20}
现在,如果复制了这个地址,或者假设浏览器恢复上一个会话,无论是谁试图访问它,他们都会得到一个条目。特别是在公共计算机中心的情况下,如果有人使用他们的凭据访问我的Web应用程序,并且在杀死浏览器之前忘记注销,则令牌系统似乎失败了。无论如何要保护令牌像加密它吗?或者某种程度上,如果浏览器/浏览器选项卡关闭或至少不在地址栏上显示,应用程序不会存储参数?我曾考虑过在每个请求中创建一个新的令牌,但它会大大减慢系统速度,所以我想避免它。
请提出一些解决此问题的方法。
提前致谢。
编辑: 现在解释系统的工作原理:
api系统托管在共享服务器的主域上,应用程序托管在子域中。主域还托管了几个Web服务,这些服务是从家里安装的几个树莓派中调用的。
这是如何工作的,登录是从主网站进行的,并且在成功登录后,通过带有用户ID,令牌和用户工作设备列表的get调用来调用Web应用程序。提供检查是为了防止在没有这三个参数的情况下访问应用页面。在新负载下,用户可以选择从下拉菜单中选择设备。现在,每个工作设备都可以运行三个独立的系统。因此,在选择设备时,再次对应用程序进行get调用,将所选设备作为参数与前三个参数一起添加。这会在地址栏中显示令牌和uid。
答案 0 :(得分:2)
基于令牌的身份验证在Web界面中非常标准。细节有所不同,但你想要做的事情当然不是疯了。但是,您的安全问题是有效的,并且有许多可能的解决方案:
奇怪的是,您在浏览器地址栏中显示了一个URL。我希望客户端应用程序只通过ajax发出请求,这意味着地址栏中不应该有任何内容。您可能需要详细说明此应用程序的工作原理。我怀疑你需要重构,以免你的应用程序URL都没有在地址栏中结束,而是专门通过AJAX请求进行操作。
然而,HTTPS是最重要的部分。 DNS查找后的整个交易将安全传输,因此令牌不会被中间人窃取。这是您必须采取的最重要步骤。如果您不使用HTTPS,您也可以向全世界广播。当然,如果您使用查询参数中的令牌向URL发出非Ajax请求,则该令牌将显示在浏览器的地址栏和历史记录中。再次,通过仅使用ajax请求并将cookie放入标题中来避免这种情况。
使用仅限Ajax的请求启用HTTPS后,令牌被盗的可能性要小得多。不过,它可能会发生(特别是通过XSS攻击),因此熟悉“纵深防御”的原则。此外,您可以采取一些步骤来尝试检测被盗令牌并使其无效。比如:
这些只是我头脑中的一些建议。尽管如此,这是一个非常标准的问题,所以谷歌将成为你的朋友。