Защита пути к mp3-файлу во флеш-плеере - PullRequest
1 голос
/ 08 февраля 2012

У меня есть флеш-плеер на моем веб-сайте для воспроизведения mp3-файлов. Но если кто-то использует «viewsource» или какие-либо инструменты браузера, такие как firebug, то он может найти параметр и затем отсортировать фактический URL-адрес mp3-файла.используя php в моей задней части.Должен быть какой-то способ скрыть эти параметры, но не могу понять, как?

Есть идеи?

1 Ответ

4 голосов
/ 08 февраля 2012

Предисловие: если вы показываете его в Интернете, вы можете украсть его. Период.

Тем не менее, вы можете сделать это намного сложнее, маскируя URL-адрес файла, передавая его через скрипт php, который выполняет две вещи:

1) Переводит зашифрованный параметр GET, который может быть проверен и может использоваться только один раз (сохранить переменную в базе данных или журнале). Этот код будет создан, когда проигрыватель загружен, и как только он начнет буферизацию, файл больше не сможет использоваться. Таким образом, параметр не может быть просто случайной строкой (он должен быть дешифруемым), и пользователь не может просто использовать тот же URL.

PHP на html-странице, которую получит пользователь, будет выглядеть примерно так:

$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))));

и затем флэш-плеер будет настроен на использование 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!");

Конечно, эта информация может быть фальсифицирована, но между ней и проходом с единым доступом вам не нужно беспокоиться о прямой загрузке. Тем не менее, помните, что есть миллион способов получить файл из потока, и просто невозможно остановить это.

...