保护php代理?

时间:2012-11-18 13:38:20

标签: php hash proxy md5

因此,在我的网站(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

然而,没过多久,有人会发现他们可以设置一个脚本来每分钟调查一次密钥 - 任何建议吗?

1 个答案:

答案 0 :(得分:2)

生成独特的令牌。你有一个散列的正确的轨道,但如果你保持你的私钥不变,它最终会被暴力强迫。从那里,彩虹桌说嗨。

你实际上不得不从用于防止CSRF滥用的机制中借用一两片叶子,因为你正在有效地尝试做同样的事情:将用户限制为每个令牌一个查询,使用不能的令牌由他们重生。

有很多方法可以做到这一点,通常的权衡取决于效率和安全性。最简单的是你所建议的 - 这很容易蛮力。 在频谱的另一端是数据库方法 - 每次访问生成一个唯一令牌,将其存储在数据库中,并根据此验证后续调用。这是相当好的数据库密集型,但效果相对较好 - 除非令牌生成很弱,否则几乎不可能破解。