Php 可接受的安全下载文件

Php 可接受的安全下载文件,php,security,download,Php,Security,Download,我已经多次看到这个问题,但它与强制下载的代码有很大关系,我认为我没有发现任何与此相关的“安全”问题。我希望人们在登录后下载东西(防止热链接)。 我正试图用htaccess和PHP来处理这个问题。PHP文件检查登录名,我还有OpenId(一些东西)。下载部分如下: $url = "{$_SERVER['DOCUMENT_ROOT']}/myfolder/{$myfile}"; if(!is_file($url)) { //whatever }elseif (is_

我已经多次看到这个问题,但它与强制下载的代码有很大关系,我认为我没有发现任何与此相关的“安全”问题。我希望人们在登录后下载东西(防止热链接)。 我正试图用htaccess和PHP来处理这个问题。PHP文件检查登录名,我还有OpenId(一些东西)。下载部分如下:

    $url = "{$_SERVER['DOCUMENT_ROOT']}/myfolder/{$myfile}";

    if(!is_file($url)) { 
   //whatever
    }elseif (is_file($url)){

    switch($url['extension']) {
            case 'pdf': $ext = 'application/pdf'; break;
            case 'zip': $ext = 'application/zip'; break;
            case 'pps': $ext = 'application/vnd.ms-powerpoint'; break;
            case 'pptx': $ext = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
            case 'docx': $ext = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
            default: $ext = 'application/force-download';
        }    
        header('Pragma: public');   
       header('Expires: 0'); 
       header("Content-Type: application/force-download");
       header("Content-Type: application/octet-stream");
       header("Content-Type: application/download");      
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Cache-Control: private',false);
       header('Content-Type: '.$ext);
       header('Content-Disposition: attachment; filename="'.basename($url).'"');
       header('Content-Transfer-Encoding: binary');
       header('Connection: close');
       readfile($url);   
       exit();
     }
Myfolder
受拒绝所有人访问的htaccess保护。 我不确定这是否足够安全,所以在我做一些非常不安全的事情之前,我会先问一下。我读过很多书,人们可以下载“你珍贵的脚本”,但我不知道如何下载(据我所知,PHP是不可下载的)。你认为我有严重的漏洞吗,除了XSS,顺便说一下,XSS是在该页面的某个地方处理的?
提前感谢。

因为评论中已经提到了这一点,在使用
echo
发送内容后,您不能发送标题


另外:确保清理用于生成文件路径的
$myfile
var,然后使用
realpath
仔细检查生成的路径是否在“允许”路径列表中。否则,有人可能会传递类似于
。/../../../supersecret/file的内容,而您就有麻烦了。

我认为这个脚本根本不起作用。您无法回显标题之前的内容。很抱歉,这是调试。但不幸的是,它确实有效,所以让我为echo和我编辑的内容感到非常抱歉。当我从头开始做一些事情时,我倾向于测试基础知识,然后构建一些更复杂的东西。如果我没有忘记在发布之前拿出helloworld测试中的内容(因为我很傻并且输入了错误,所以我没有访问{$\u服务器['DOCUMENT\u ROOT']}),那就更好了$我的文件已清理,但我没有复制该部分(它已经太长了)。我通过$u POST传递var it(因为get作为一般规则让我担心),并对其进行清理。谢谢你的realpath。你认为我应该在下载之前检查文件扩展名吗?如果你允许下载的目录只包含可下载的文件(这是个好主意),那么只检查路径就足够了。