我已经在我正在进行的项目中实施了一个安全系统,如下所示(请告诉我图中是否有不清楚的地方,但它很简单)
这与它应该完全一样,但如果有人发出请求,并在客户端收到令牌后立即中止,那么活动令牌仍然在数据库中,并且可以被恶意使用黑客。
虽然我在verifyToken步骤中从数据库中删除了令牌,但如果令牌没有到达它,它仍然可用。如果在发出令牌后请求被中止,你们认为处理令牌的方法是什么?
此外,即使客户端获得对令牌的访问权限,他也只能在令牌被标记为无效之前发出一个请求。但是,即使是一个请求也可能非常危险。
更新 :我的令牌机制如下:
发送令牌:
1)生成2个随机令牌:token1和token2。
2)生成如下的哈希:token1 + userid + SALT
3)将所有数据存储在数据库中。
4)发送token1,token2和新的哈希(我称之为id_hash)
验证令牌:
1)接收token1和token2。
2)如果token2与数据库中的不匹配,则返回FALSE。
3)从会话中获取用户ID。
4)按以下顺序哈希:token1(已接收)+ userid(会话)+ SALT
5)使用收到的id_hash验证新验证的哈希值。
6)如果匹配,则返回TRUE,否则返回FALSE。
这样,用户只能访问/更改与其用户ID相关的数据,而不能访问其他用户的ID。 你觉得这样就够了吗?或者这种方法存在缺陷吗?
我在apache2 webserver上使用PHP和MySQL。
答案 0 :(得分:0)
在客户端发送令牌存储时随机字符串用作盐(不是盐随机检查)
由于所有请求都应在会话中发送,请发送此随机字符串以及验证您正在与正确的客户端通信的请求(在第一阶段发送 - 请求令牌然后在验证时验证此令牌)。
这显然不会阻止任何人拦截消息,但是如果他们获得了未使用的令牌,那么没有随机字符串作为第二次测试就没用了。
此外,还会为您的令牌添加时间戳 - 如果在创建后的10秒内未对其进行验证,则会使其无效。
答案 1 :(得分:0)
这是我的方法。
我会在每3分钟后重新验证并重新生成令牌。
在处理该令牌发出的任何请求之前,我会检查它是否有效。
这将自动验证较旧的令牌。
第二种方式:
TimeStamp
:使用时间戳检查该令牌的有效性。如果该令牌在最后3分钟内没有任何活动,则使该令牌无效。为此,您需要cron job
来使该脚本在每个特定的时间间隔内运行。
希望它会帮助你。