2012-02-08 51 views
1

我在我的网站上播放MP3文件的Flash播放器。但如果有人使用“viewsource”或任何浏览器工具(如萤火虫),那么他们可以找到参数,然后整理出实际的mp3文件url.I在我的后端使用php。应该有一些隐藏这些参数,但不知道如何?保护Flash播放器中的MP3文件路径

任何想法?

+1

Sidenote,但即使您在Flash文件中对URL进行了硬编码,人们仍然可以使用Fiddler等功能非常轻松地截取(并保存)MP3的单独请求。 – 2012-02-08 02:45:24

回答

4

前言:如果你在网上显示它,你可以窃取它。期。

这就是说,你可以将其通过一个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!"); 

当然这些信息可以伪造,但它之间和单通行证,你不应该担心直接下载。也就是说,请记住,有一百万种方法可以从流中获取文件,并且无法阻止该文件。