5

我有一个音乐播放器,它使用以下语法链接到一首歌曲:

<li><a href="" data-src="http://s3.amazonaws.com/audiojs/02-juicy-r.mp3">title</a></li>

有什么方法可以让我执行服务器端然后为用户显示(见下文)?

在搜索时,我遇到了这个......我喜欢拥有一个包含数据的外部文件背后的想法......比如:

<?php
// get-file.php
// call with: http://yoururl.com/path/get-file.php?id=1
$id = (isset($_GET["id"])) ? strval($_GET["id"]) : "1";
// lookup
$url[1] = 'link.mp3';
$url[2] = 'link2.mp3';
header("Location: $url[$id]");
exit;
?>

然后使用:http: //yoururl.com/path/get-file.php ?id=1作为链接...唯一的问题是当您键入http://yoururl.com/path/get-file 时。 php?id=1用户直接进入文件...有什么方法可以禁用该功能...可能是 get-file.php 本身的一些代码?

4

5 回答 5

5

好的,所以我做了一些我满意的事情......虽然不是完全安全,但它确实帮助我掩盖了它。

首先,我使用 AudioJS 播放器播放音乐 - 可以找到: http: //kolber.github.com/audiojs/

基本上我所做的是:

  1. 我没有使用“data-src”作为我的歌曲的路径,而是将其称为“key”,这样人们就不一定会认为这是一条路径。
  2. 我没有使用“my-song-title”作为歌曲的名称,而是将其更改为 7364920 之类的数字,这样人们就无法在源中查找它并以这种方式找到 URL。
  3. 在所有“关键”变量之后,我在 javascript 代码中添加了 +“mp3”,这样我就不必在模糊链接中声明它。
  4. 我使用了像“./8273019283/”这样的相对路径而不是“your-domain.com/8273019283/”,这样就很难判断我正在显示一个网址。
  5. 向 href 添加了一个 iTunes 链接,这样人们可能会对我如何提取文件感到困惑。

所以,现在我的内联 javascript 看起来像:

<script type="text/javascript">
        $(function() {
            // Play entire album
            var a = audiojs.createAll({
                trackEnded: function() {
                    var next = $("ul li.playing").next();
                    if (!next.length) next = $("ul li").first();
                    next.addClass("playing").siblings().removeClass("playing");
                    audio.load($("a", next).attr("key") + "mp3");
                    audio.play();
                }
            });
            // Load the first song
            var audio = a[0];
            first = $("ul a").attr("key") + "mp3";
            $("ul li").first().addClass("playing");
            audio.load(first);
            // Load when clicked
            $("ul li").click(function(e) {
                e.preventDefault();
                $(this).addClass("playing").siblings().removeClass("playing");
                audio.load($('a', this).attr('key') + "mp3");
                audio.play();
            });
        });
    </script>

我的链接看起来像:

<a href="<?php $link = 'http://itunes.apple.com/us/album/falling/id504779876?i=504779883&uo=4'; $obfuscatedLink = ""; for ($i=0; $i<strlen($link); $i++){ $obfuscatedLink .= "&#" . ord($link[$i]) . ";"; } echo $obfuscatedLink; ?>" target="itunes_store" key="<?php $link = './8249795872/9273847591.'; $obfuscatedLink = ""; for ($i=0; $i<strlen($link); $i++){ $obfuscatedLink .= "&#" . ord($link[$i]) . ";"; } echo $obfuscatedLink; ?>">Falling</a>

当您在浏览器中加载它并查看源代码时,您会看到:

<a href="&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#105;&#116;&#117;&#110;&#101;&#115;&#46;&#97;&#112;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#47;&#117;&#115;&#47;&#97;&#108;&#98;&#117;&#109;&#47;&#102;&#97;&#108;&#108;&#105;&#110;&#103;&#47;&#105;&#100;&#53;&#48;&#52;&#55;&#55;&#57;&#56;&#55;&#54;&#63;&#105;&#61;&#53;&#48;&#52;&#55;&#55;&#57;&#56;&#56;&#51;&#38;&#117;&#111;&#61;&#52;" target="itunes_store" key="&#46;&#47;&#56;&#50;&#52;&#57;&#55;&#57;&#53;&#56;&#55;&#50;&#47;&#57;&#50;&#55;&#51;&#56;&#52;&#55;&#53;&#57;&#49;&#46;">Falling</a>

然后,当您使用 Web Inspector 或 Firebug 时,您会看到:

<a href="http://itunes.apple.com/us/album/falling/id504779876?i=504779883&amp;uo=4" target="itunes_store" key="./8249795872/9273847591.">Falling</a> - *which doesn't completely give the url away

基本上我所做的就是让链接看起来像是某种 api-key。很酷的是,您不能直接从查看源代码或直接从 Web Inspector/Firebug 复制链接。它不是万无一失的,而且绝对可以被打破,但用户必须知道他们在做什么。它让大多数人远离,但仍然允许播放器获取播放歌曲所需的 url :)

*另外,我从 Stack Exchange 的某个地方获得了 php 混淆脚本,只是不确定在哪里。

于 2012-07-01T23:05:29.400 回答
1

无需进行标头重定向,而是添加适当的标头并将音频文件包含在您的 PHP 代码中。然后,在您的 .htaccess 文件中,您可以禁止访问您的音频文件所在的目录。

于 2012-06-25T18:58:52.123 回答
0

不,这是不可能的,因为它是浏览器解释 HTML 以使页面正常工作。因此,如果客户端(浏览器)不知道 mp3 来自哪里,那么它将无法使用。

另一方面,如果您想通过单击链接让音乐切换歌曲,那么我建议您查看一些工具,例如http://jplayer.org/

编辑:可能阻止直接访问文件本身的唯一方法是读取文件而不是从脚本链接到它。例如,在我的图像托管站点http://www.tinyuploads.com/images/CVN5Qm.jpg上,如果您要查看我服务器上的实际文件路径,则文件 CVN5Qm.jpg 从 public_html 文件夹中看不到. 无法直接访问该文件。我使用数据库获取图像 ID,查找它的存储位置,然后将其 readfile() 写入脚本并显示正确的标题以输出图像。

希望这可以帮助

于 2012-06-25T18:47:18.977 回答
0

如果您使用的是 amazon s3 服务,则可以为您的文件使用签名 url。这会更安全,因为您必须是签名用户,而且 url 也可以过期。读这个

于 2012-06-25T19:02:50.827 回答
0

我使用 http_referer,我可以控制链接的过程

<?php
// key.php
// call with: http://yoururl.com/path/key.php?id=1
$page_refer=$_SERVER['HTTP_REFERER'];


if ($page_refer=="http://www.yourdomine.com/path/page.html")
    {
    $id = (isset($_GET["id"])) ? strval($_GET["id"]) : "1";
    // lookup
    $url[1] = 'link1.mp3';
    $url[2] = 'link2.mp3';
    header("Location: $url[$id]");
    exit;
    }
else
    {
    exit;
    }
?>
于 2013-07-23T10:32:36.610 回答