在CMS应用程序中,我偶尔需要打开另一个域的iframe。目前我将该iframe的网址设置为非常模糊的内容。像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";
另一方面,您应首先检查时间戳是否在限制范围内(例如,不超过五分钟),然后重新检查密钥和提交的时间戳。如果获得相同的哈希,则请求有效。
笔记:
hash_equals
比较哈希来防止时间攻击你不应该使用普通的MD5; MD5不是为确保邮件真实性而设计的。相反,您可以公开提供时间戳,以及其他信息(消息),base64编码,以便它不包含“:”字符。然后,您可以计算消息的HMAC代码,例如
$hmac = hash_hmac("md5", $message, $secret)
$signed_message = $message . ":" . $hmac
在另一端,你可以检查这个签名,首先用“:”拆分,得到$ message和$ hmac,然后你可以检查真实性
$hmac == hash_hmac("md5", $message, $secret)
如果代码匹配,则检查$message
中的时间戳是否仍在限制范围内。
小心使用MD5进行散列 - 它是加密破坏的。有许多在线网站可以帮助创建冲突。而是使用像SHA256这样的东西,并且总是包含一个长盐渍字符串。
如果用户不必与iframe中的站点进行交互,您可以考虑抓取站点代码并将其直接插入到代码中。有许多库可用于此。
怎么样使用像
$hash = hash ( "sha256" , date("h") . 'myverylongsaltstring' );
只要服务器的时区正确并且在一小时内同步,这种方法就像你的time()哈希一样。
此外,您可以使用像TinyUrl这样的东西来进一步混淆链接。沿着http://www.technabled.com/2008/12/create-your-own-tinyurl-with-php-and.html的路线
如果它是基于时间的,那么一个人必须猜测的可能键的数量将是微小的。由于我大致知道什么时候可能会生成URl,而且我知道你是如何散列它的,所以我可以创建数十万个链接并测试它们。
您应该使用UUID或类似的东西。碰撞的可能性基本上是不可能的。