因此,在我的网站(https://example.com)上,我有一个分析last.fm API的页面,并将这些图像从他们的akamai CDN上撤回并在页面上显示。
事情是所有图像仅在HTTP上提供,不支持https。
例如:http://userserve-ak.last.fm/serve/64s/76030502.png
我有一个用php编写的图像代理:
<?php
header('Content-Type: image/png');
if(isset($_GET['img'])){echo file_get_contents($_GET['img']);}
?>
这完全有效,但是根本不安全,我想要它只有我的服务器可以使用图像代理,因此URL中的哈希可能是最好的选择?
https://example.com/proxy.php?url=http://last.fm/image.jpg&hash=hashhere
我原本想过使用:
md5($_GET['img']."privatekeyhere");
然后我的问题转向了,如何在没有全世界访问权限的情况下将私钥放入javascript代码中?
任何帮助都非常感激。
我已经编写了这个有效但仍然可以被规避的脚本:
<?php
$args = $_GET['q'];
$date = date('m-d-Y-h-i', time());
list($hash,$img,$auth) = explode("/", $args);
if($hash=="need" && $auth=="key"){
$checksum = md5($img.$date);
echo $checksum;
}
if($hash==md5($img.$date))
{
header('Content-Type: image/png');
echo file_get_contents('http://userserve-ak.last.fm/serve/64s/' . $img);
}
?>
可以这样调用:https://www.mylesgray.com/lastfm/need/76030502.png/key
然后可以插入验证码以显示图像:https://www.mylesgray.com/lastfm/{code-here}/76030502.png
然而,没过多久,有人会发现他们可以设置一个脚本来每分钟调查一次密钥 - 任何建议吗?
答案 0 :(得分:2)
生成独特的令牌。你有一个散列的正确的轨道,但如果你保持你的私钥不变,它最终会被暴力强迫。从那里,彩虹桌说嗨。
你实际上不得不从用于防止CSRF滥用的机制中借用一两片叶子,因为你正在有效地尝试做同样的事情:将用户限制为每个令牌一个查询,使用不能的令牌由他们重生。
有很多方法可以做到这一点,通常的权衡取决于效率和安全性。最简单的是你所建议的 - 这很容易蛮力。 在频谱的另一端是数据库方法 - 每次访问生成一个唯一令牌,将其存储在数据库中,并根据此验证后续调用。这是相当好的数据库密集型,但效果相对较好 - 除非令牌生成很弱,否则几乎不可能破解。