在 CMS 应用程序中,我偶尔需要打开另一个域的 iframe。目前,我将该 iframe 的 URL 设置为非常模糊的内容。像 http://domain.com/iframe/jhghjg34787386/ 。这可行,但理论上 iframe 源 url 将保存在用户的历史记录中,并且可以从外部世界访问。
因此,我想知道如何使用基于时间的方法来处理在请求端处理并在 iframe 源端检查的不断变化的哈希或字符串。但是我希望它是基于时间的。
我可以这样做来获取我的哈希值:
<?php
$seed = '123456789'; // a password that both the parent and source have
$string = md5(time().$seed);
?>
但是这两个服务器必须完全同步。有什么方法可以使时间限制更加模糊?
我也对其他方法持开放态度。有什么方法可以验证 iframe 的父窗口是否属于某个域?
最佳答案
您可以将一个键添加到您的散列中,并在查询中发送时间戳,例如:
$key = "YOUR_SECRET_KEY";
$time = time();
$hash = hash_hmac('sha256', $time, $key);
$url = "https://example.com/iframe?hash=$hash&time=$time";
另一方面,您应该首先检查时间戳是否在限制范围内(例如不超过五分钟),而不是使用 key 和提交的时间戳重新散列。如果您获得相同的哈希值,则请求有效。
注意事项:
- 不要使用 MD5:该算法已完全损坏并且不再提供任何安全性(尽管它在与 HMAC 一起使用时应该仍然可以......)
- 您应该使用
hash_equals
来比较哈希以防止定时攻击 - 我们使用 HMAC 来保证数据完整性和身份验证。参见 https://crypto.stackexchange.com/questions/1070/why-is-hkx-not-a-secure-mac-construction为什么我们不能只是连接时间和 key
关于php - 使用基于时间的旋转散列或字符串来确保安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7965710/