有没有比这更简单的通过 PHP 请求特定音频文件的方法?

Posted

技术标签:

【中文标题】有没有比这更简单的通过 PHP 请求特定音频文件的方法?【英文标题】:Is there a less hacky way of requesting a specific audio file through PHP than this? 【发布时间】:2017-10-28 23:30:15 【问题描述】:

我需要将 php 脚本输出中的音频文件放入 html 音频标签的源中。我无法指定哪个,因为我无法添加 POST 变量,所以我通过 ajax 调用设置 SESSION “songRequested”,然后请求文件并使用会话变量指定哪个文件是必要的。

HTML

<audio id ="player">
    <source src="" id = "source">
</audio>

JS

$.post('includes/songrequest.php','request':songName,function()
$('#source').attr("src","includes/songrequest.php");
    player.load();
    player.play();
);
//Declare the session variable as the file you want and set the audio source to be the songrequest php below with the session variable as the file to be downloaded.

PHP

<?php
session_start();
if(!isset($_SESSION['u_uid']))
    exit(); 

if(isset($_POST['request']))
    $_SESSION['request'] = $_POST['request']; 
    //If requesting with post variables, set the session variable to it.
    exit(); 

//Otherwise, retrieve the file set as the session variable
$file = dirname(getcwd(),2)."\\users\\".$_SESSION['u_uid']."\\".$_SESSION['

header('Content-Type: audio/'.pathinfo($file,PATHINFO_EXTENSION));
header('Cache-Control: no-cache');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');
readfile($file);

我不得不这样做,因为当我在音频标签中调用 php 源时,我无法传递 post 变量,而且我不知道有一种方法可以真正在 javascript 中本地处理音频数据。

【问题讨论】:

这意味着什么as I can't add POST variables 还有一些您现在拥有的代码将有助于查看您正在尝试做什么。 @ArtisticPhoenix 添加了代码并更好地解释了自己,对不起。 我只想指出,像这样将帖子设置到会话中可能会导致您产生一些意想不到的结果。更不用说你真的不应该从安全立场来看,你不知道请求的是什么,所以你应该运行一些过滤器以确保将其安全地放入你的应用程序中。 是的,我会这样做。现在只是一个原型。无论哪种方式,我希望这种方法实际上不会成为我将使用的方法,并且我会找到其他方法来传递文件名。 如果你不能添加post数据,那么你可以使用get你也可以使用URL的URI段,就像$('#source').attr("src","includes/songrequest.php/songname");这样songname可以在@里面访问987654328@全球晚餐。值得一提的是,为了安全起见,您只需要传递文件名,并检查提供的文件名中是否没有目录分隔符 / 和 \ 以及不以 . 开头,这将防止目录横向 【参考方案1】:

Rally 没有什么比 post 更安全的了get 请求。两者都可以针对您的网站进行欺骗。如果您问我,最好的方法是不要使用它们中的任何一个,而是使用 URI 段。 我应该提到这并不比 post 或 get 更安全 URI 的主要优点是您仍然可以使用 get 和 post 数据而不会混淆它。当您考虑它时,从逻辑上讲,它是您要识别的资源,因此仅使用 URL/URL 是有一定意义的。

URI 是 URL 中位于“真实”资源位置之后的部分。一个例子是

$('#source').attr("src","includes/songrequest.php/songname‌​");

songname 是请求 URI。这通常用于 MVC 框架中,通过主要的index.php 管道所有内容。如www.example.com/index.php/some_controller/some_method。这通常是通过使用 mod_rewrite ( HTACCESS ) 重写 URL 来隐藏的。

现在要访问该数据,您可以查看$_SERVER Super Global,它应该类似于$_SERVER['PATH_INFO'](我忘记了)。您可能需要修剪一些斜线或清理一下。..

现在关于该数据的内容。我建议甚至不传递文件名,只传递哈希或 ID 或歌曲名等。然后您使用它来查找实际路径。这将防止使用您不想要的路径,因为该路径来自一个内部数据源,您正在传递的“一块”数据会查找该数据源。

所以你会传递这样的东西(如果使用漂亮的哈希)

$('#source').attr("src","includes/songrequest.php/2Bzi0U8t");

然后您在数据库中查找该值,获取 URL 并继续。

我也不认为这样做有什么本质上的错误

$('#source').attr("src","includes/songrequest.php?song=2Bzi0U8t");

这里的关键是不要传递实际路径,因为这可能会被目录横向利用。哪个,是黑客提供类似这样的路径的地方

song=../../../somefile_we_dont_want_a_hacker_accessing.txt

基本上,它允许他们在文件系统上导航并访问他们不应该访问的内容。但是通过使用查找,他们能做的最糟糕的事情就是查找已经存储在您的数据库中的内容。

有道理。

【讨论】:

非常感谢您的帮助!谢谢! 当然,很高兴我能帮上忙。

以上是关于有没有比这更简单的通过 PHP 请求特定音频文件的方法?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 一个依赖搞定 session 共享,没有比这更简单的方案了!

来一波SpringBoot开源项目,没有比这更简单了

关于 RabbitMQ,应该没有比这更详细的教程了

整理了大数据学习全套资源,大概没有比这更全的了!

全网最全微服务架构—Spring Cloud详解,没有比这更详细的了!

iOS-Runtime 10种用法(没有比这更全的了)