保护flash播放器中的mp3文件路径

时间:2012-02-08 02:43:25

标签: php flash mp3

我的网站上有flash播放器用于播放mp3文件。但是如果有人使用“viewsource”或任何浏览器工具,如firebug,那么他们可以找到参数,然后整理出实际的mp3文件url.I am在我的后端使用PHP。应该有一些隐藏这些参数,但无法弄清楚如何?

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

前言:如果你在网上展示它,你可以偷它。周期。

也就是说,你可以通过将文件的URL传递给执行两件事的php脚本来掩盖文件的URL,从而更加困难:

1)转换可以验证的加密GET参数,并且只能使用一次(将变量存储在数据库或日志中)。加载播放器时将创建此代码,一旦开始缓冲,文件将无法再次使用。这样,参数不能只是一个随机字符串(它必须是可解密的),用户不能只使用相同的URL。

用户将收到的html页面中的php看起来像:

$key = 'My EnCyption Key';
$unique_string = "Generated at ".time().$_SERVER['REMOTE_ADDR']; //the time element changes the string each time and the IP address controls for multiple users simultaneously loading the same page
$tolken = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));

然后flash播放器将设置为使用mp3文件:

http://yoursite.com/mp3/file_fetcher.php?file_id=123&tolken=<?php echo $tolken;?>

文件file_fetcher.php会有这样的东西(显然这需要一些充实的东西):

$fixed_string_part = "Generated at ";
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($_GET['tolken']), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
if (substr($decrypted,0,strlen($fixed_string_part))!=$fixed_string_part){
   die("Your tolken is invalid");
}
//check that the tolken hasn't been used before:
$check_query = mysql_query("select * from `mp3_tolken_log` where `tolken`='$decrypted';",[connection identifier]); //write this more cleanly
if (mysql_num_rows($query)){
    die("You've already used that tolken!");
} else {
   $log_it = mysql_query("insert into `mp3_tolken_log` (`tolken`,`dateadded`) VALUES ($decrypted,NOW())"); //make sure it's in there so it can't be used again
}

//now get the file if we haven't already died
$contents = file_get_contents([path/to/mp3/file/specified/by/id/$_GET['file_id']]);
header('Content-Type: audio/mpeg');
echo $contents;

2)检查引荐网站是否是您自己的网站(而不是他们尝试直接访问脚本)。类似的东西:

if (!isset($_SERVER['HTTP_REFERER'])){die("Restricted Access!");};
$_u=parse_url($_SERVER['HTTP_REFERER']);
$_u=preg_replace("/(www.)/i","",strtolower($_u['host']));
$_i=$_SERVER['HTTP_HOST'];
$_i=preg_replace("/(www.)/i","",strtolower($_i));
($_u == $_i) or die("Restricted Access!");

当然这些信息可以伪造,但在它和单次访问之间你不必担心直接下载。也就是说,请记住,有一百万种方法可以从流中获取文件,而且没有办法阻止它。