【问题标题】:Best method to dispose of an unused security token?处置未使用的安全令牌的最佳方法是什么?
【发布时间】:2014-05-24 17:21:25
【问题描述】:

我已经在我正在做的一个项目中实现了一个安全系统,如下(如果图中有什么不清楚的地方请告诉我,虽然很简单)

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

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

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

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

发送令牌:

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

2) 生成这样的哈希:token1+userid+SALT

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

4)发送token1、token2和新的hash(我称之为id_hash)

验证令牌:

1)接收token1和token2。

2)如果token2与数据库中的不匹配,则返回FALSE。

3) 从会话中获取用户 ID。

4)按以下顺序散列:token1(received) + userid (session) + SALT

5) 使用收到的 id_hash 验证新验证的哈希。

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

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

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

【问题讨论】:

  • 一个唯一令牌可以发出多少次请求?
  • @fortune 考虑到令牌在 verifyToken 步骤中被删除,我想说它们只能使用一次。
  • 顺便说一句,丢弃,而不是丢弃
  • @CreativeMind 错字:P
  • 在你的帖子里... :P

标签: php security authorization


【解决方案1】:

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

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

这显然不会阻止任何人截获消息,但如果他们得到未使用的令牌,如果没有随机字符串作为第二次测试,它将毫无用处。

另外为您的令牌添加时间戳 - 如果在创建后 10 秒内未验证它们,则它们将无效。

【讨论】:

  • 我明白了。虽然,我已经做了那部分。但是要将字符串与请求一起发送,我们必须将其包含在表单中。这不会让攻击者看到它吗?如果正确的客户是攻击者他/她自己呢?然后他可以在任何地方使用那个令牌,只要他知道令牌是什么……
  • 是的,但您的问题不是关于如何保护连接免受拦截 - 这应该使用 SSL 证书来完成。以上确保您的令牌的有效性 - 通过 cron 作业每小时/每晚销毁所有令牌,因为它们应该是短暂的。
  • 我确实有一个 SSL 证书,并且所有的连接都是加密的。另外,请参阅更新的问题。而且我确实有一个 cron 作业,它会删除所有 10 分钟内处于非活动状态的令牌。
  • 您的方式可行并且足够安全(您很可能在此授权系统之外的其他地方有更多漏洞)-但是oAuth有什么问题-oauth.net/code-因为它是行业标准并且开箱即用,我不明白您为什么要这样做,而不是为了学习?
  • 好吧,我觉得我已经充分回答了您的原始问题和修改后的问题-我也经常出于教育目的而制作东西-但我将始终与行业标准进行比较,因为它们是由 a) 更聪明的人制作的比我和 b) 数千个单元测试一个人无法单独完成 - 发现你不会想到的漏洞 - 我现在会剖析 oAuth 库,因为你的方式和你单独完成一样强大 - a +1如果你觉得你不能接受我的回答,如果我能帮忙就好了!!!
【解决方案2】:

这就是我的方法。

我会在每 3 分钟后重新验证和重新生成令牌。

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

这将自动使旧令牌无效。

第二种方式:

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

希望对您有所帮助。

【讨论】:

  • 我明白了。但是,如果我在页面加载时发送一个令牌,它会一直留在那里直到用户提出请求?如果用户在 5 分钟内没有提出任何请求,那么他/她的令牌将过期并且他/她会看到一个错误?
  • @abhishek 您可以使用Ajax 保持连接处于活动状态,因此即使用户没有提出请求,您也可以在脚本中进行。
  • 保持连接不会是一个更大的缺陷吗?好像攻击者获得了访问权限,他可以恶意使用该连接对吗?
  • 如果你使用Session这个方法来验证,那么攻击者很难使用session hijacking
  • 更新问题,抱歉,错字:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2012-06-17
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
相关资源
最近更新 更多