【问题标题】:Set Content-Type dynamically动态设置 Content-Type
【发布时间】:2013-02-06 13:28:26
【问题描述】:

我有以下代码,我用它来强制下载文件而不是在浏览器中打开。

if(isset($_POST['file_name'])){
$player_file = $_POST['file_name'];
$accessKey = "REMOVED";
$secretKey = "REMOVED";
$bucket = $_POST['bucket'];
$fname = $_POST['fname'];

$zip_url = el_s3_getTemporaryZipLink($accessKey, $secretKey, $bucket, $fname);
$mp3_url = el_s3_getTemporaryMP3Link($accessKey, $secretKey, $bucket, $fname);    


header('Content-type: audio/mpeg3');
header('Content-Disposition: attachment; filename="themixtapesite_'.$player_file.'"');
readfile($mp3_url);
exit();
}

如您所见,我从一个表单传递所有变量。然后使用该信息为存储在 Amazon S3 上的文件生成唯一的签名 URL。

如果文件是 MP3,我需要它使用 $mp3_url,如果它是 Zip 文件,我需要使用 $zip_url。

这一定很简单,但是我整天坐在屏幕前,现在脑子一片空白!

任何帮助表示赞赏。

【问题讨论】:

  • 创建一个数组保存扩展。检查请求文件的扩展名并据此设置内容类型。
  • 依赖扩展来检查内容类型是一个坏习惯...

标签: php content-type


【解决方案1】:
  1. 此代码是一个巨大的安全漏洞。您刚刚为任何愿意使用它的人打开了您的服务器的大门。
  2. 使用array of mime types 来确定扩展名之外的 MIME 类型(不过,您需要进行额外的安全检查,因为仅在扩展名上中继并不明智)。
  3. 使用 switch 语句来确定使用哪个函数。切换后你应该有$url - 只有一个变量存储扩展,而不是两个不同的变量。

【讨论】:

  • 感谢@MarcinWolny 的回复。你能详细说明它的安全方面吗?只是为了澄清使用 POST 表单提交的信息不是用户输入。它是由另一个页面的变量填充的隐藏字段。
  • @BarryJarvis 没有“表单使用 POST 提交的信息不是用户输入”。这是导致人们的网站被黑客入侵的最常见错误之一。虽然我不称之为黑客攻击:它是访问不安全的系统。 任何通过 POST 或 GET 发送的数据都可以被任何在网站管理方面有一点经验的人轻松更改。您的安全缺陷是您假设 POST 数据甚至是远程安全或可预测的。不是。
  • 我使用的表单是下载文件,我使用表单的原因是隐藏文件的直接url。我用设置了必要信息的变量填充表单。有没有更好的方法来强制下载文件而不是通过表单传递信息并设置标题?我对 PHP 很陌生,所以我可能犯了书中的所有错误! 附言我更新了代码以反映我在其中所做的更改...通过表单传递我的访问密钥当然是不明智的!
  • 您始终可以传递带有文件名哈希的 ID(强制类型为整数)之类的东西来检索正确的文件。处理整数会让你更安全。所以基本上 - 首先你发送一个 ID,使用这个 ID 从数据库中检索文件条目,将存储的文件名哈希与你从客户端获得的哈希值进行比较 - 如果两者都匹配:向客户端发送正确的文件(你可以将完整的文件名存储在数据库)。
猜你喜欢
  • 1970-01-01
  • 2014-03-06
  • 2020-09-30
  • 2011-05-24
  • 2013-11-07
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多