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
Php 处置未使用的安全令牌的最佳方法?_Php_Security_Authorization - Fatal编程技术网

Php 处置未使用的安全令牌的最佳方法?

Php 处置未使用的安全令牌的最佳方法?,php,security,authorization,Php,Security,Authorization,我在一个项目中实现了一个安全系统,如下所示(如果图中有不清楚的地方,请告诉我,尽管很简单) 这与它应该的工作方式完全相同,但是如果有人发出请求,并在客户端收到令牌后立即中止请求,那么活动令牌仍将位于数据库中,并且可能被黑客恶意使用 虽然我在verifyToken步骤中从数据库中删除了令牌,但如果令牌尚未到达,它仍然可用。如果发出令牌后请求被中止,你们认为处置令牌的方法是什么 此外,即使客户端获得对令牌的访问权,他也只能在令牌被标记为无效之前发出一个请求。但是,即使是一个请求也是非常危险的 更新

我在一个项目中实现了一个安全系统,如下所示(如果图中有不清楚的地方,请告诉我,尽管很简单)

这与它应该的工作方式完全相同,但是如果有人发出请求,并在客户端收到令牌后立即中止请求,那么活动令牌仍将位于数据库中,并且可能被黑客恶意使用

虽然我在verifyToken步骤中从数据库中删除了令牌,但如果令牌尚未到达,它仍然可用。如果发出令牌后请求被中止,你们认为处置令牌的方法是什么

此外,即使客户端获得对令牌的访问权,他也只能在令牌被标记为无效之前发出一个请求。但是,即使是一个请求也是非常危险的

更新:我的令牌机制如下:

发送令牌:

1) 生成2个随机令牌:令牌1和令牌2

2) 生成如下哈希:token1+userid+SALT

3) 将所有数据存储在数据库中

4) 发送token1、token2和新散列(我称之为id\u散列)

验证令牌:

1) 接收令牌1和令牌2

2) 若token2和数据库中的token2不匹配,则返回FALSE

3) 从会话获取用户id

4) 按以下顺序对其进行散列:token1(已接收)+userid(会话)+SALT

5) 使用接收到的id\u哈希验证新验证的哈希

6) 如果匹配,则返回TRUE,否则返回FALSE

这样,用户只能访问/更改与其用户ID相关的数据,而不能访问/更改其他用户的ID。 你们觉得这够了吗?或者这种方法有缺陷吗


我在apache2 Web服务器上使用PHP和MySQL。

在发送令牌时,在客户端存储一个随机字符串用作salt(当然不是salt,而是随机检查)

由于所有请求都应该发生在会话中,因此,请将此随机字符串与验证您是否与正确的客户端对话的请求一起发送(在第一阶段发送-请求令牌,然后在验证时根据此令牌进行验证)

这显然不会阻止任何人截取消息,但是如果他们得到了未使用的令牌,那么如果没有随机字符串作为第二个测试,这将是无用的


另外,给你的令牌添加一个时间戳——如果它们在创建后的10秒内没有被验证,那么将使它们无效

这是我的方法

我将每隔3分钟重新验证并重新生成令牌

在处理该令牌发出的任何请求之前,我将检查它是否有效

这将自动验证旧令牌

第二种方式:

时间戳
:使用时间戳检查该令牌的有效性。如果该令牌在最后3分钟内没有任何活动,则该令牌无效。为此,您需要一个
cron作业
,以使该脚本每隔特定的时间间隔运行一次


希望对你有帮助

一个唯一的令牌可以发出多少次请求?@fortune考虑到令牌在verifyToken步骤中被删除,我认为它们只能使用一次。顺便说一下,处置,而不是处置-off@CreativeMind打字错误:把你的帖子也钉起来…:我明白了。虽然,我已经做了那部分。但是要将字符串与请求一起发送,我们必须将其包含在表单中。这难道不能让攻击者看到它吗?如果正确的客户机本身就是攻击者呢?然后,他可以在任何地方使用该令牌,只要他知道该令牌是什么……是的,但你的问题不是如何保护连接免受拦截——这应该通过SSL证书来实现。以上内容确保您的令牌的有效性-通过cron作业每小时/晚上销毁所有令牌,因为它们应该是短期的。我有一个SSL证书,所有连接都是加密的。另外,请参见更新的问题。我有一个cron任务,它会删除10分钟内不活动的所有令牌。您的方法会起作用,并且足够安全(您在其他地方很可能比在这个授权系统中有更多的漏洞)-但是oAuth有什么问题吗?鉴于它是行业标准,而且工作方式非常简单,我不明白你为什么要这样做,而只是为了学习练习?我觉得我已经充分回答了你的原始和复杂的问题-我也经常出于教育目的制作东西-但我将始终与行业标准,因为他们是由a)比我更聪明的人和b)一个人无法单独完成的数千个单元测试-查找您想不到的漏洞-我现在将剖析oAuth库,因为您的方法与您将单独实现的方法一样强大-如果您不这样做,我将提供帮助,a+1将非常棒感觉你可以接受我的答案!!!我懂了。但若我在页面加载时发送一个令牌,它会一直留在那个里,直到用户发出请求,那个该怎么办呢?如果用户在5分钟内没有发出任何请求,那么他/她的令牌将过期,他/她将看到一个错误?@abhishek您可以使用
Ajax
,保持连接活动,因此即使用户没有发出请求,您也可以在脚本中进行。保持连接活动不是一个更大的缺陷吗?就像攻击者获得访问权限一样,他可以恶意使用该连接,对吗?如果您使用此方法验证
会话
,那么攻击者使用
会话劫持
。更新问题,抱歉,输入错误:P