2010-05-21 145 views
2

我目前正在使用PHP上传一个文件上传sript,但我有点卡住了。用户可以上传PHP和JS等文件,但我不希望脚本在用户尝试下载时运行。是否有可能使用htaccess或其他方式阻止?导航到目录时忽略目录中的脚本文件?

+3

[目录禁用PHP(包括所有子目录)用的.htaccess]的可能重复(http://stackoverflow.com/questions/1271899 /禁用-php-in-directory-including-all-sub-directories-with-htaccess) – 2010-05-21 14:31:30

+0

那么,PHP是唯一一个我现在不得不担心的脚本语言吗? – qwerty 2010-05-21 14:46:01

+0

对不起,我应该把这个链接作为评论。虽然PHP是您提到的唯一服务器端脚本。 – 2010-05-21 14:50:29

回答

1

你可以写一个PHP包装将文件内容发送到浏览器的文件。但首先您必须确保您上传的文件存储在网络根目录以外的,以便任何人无法通过浏览器无意中或以其他方式访问它们。

的包装PHP脚本可以去的东西沿着这些路线:

<?php 
    $f = $_GET[ "f" ]; 
    if (filename_is_ok($f) && is_file("../some_folder_outside_www/$f")) 
    { 
     header("Content-Type: text/plain"); 
     header("Content-Disposition: attachment; filename=$f"); 
     header("Content-Length: " . filesize("../some_folder_outside_www/$f")); 
     readfile("../some_folder_outside_www/$f"); 
    } 
    else 
    { 
     header("HTTP/1.0 404 Not Found");    
     echo "File not found (or you're not supposed to view this file)"; 
    } 
    function filename_is_ok($f) 
    { 
     // You'll have to implement it yourself 
     return false; 
    } 
    // example calls: 
    // http://website.com/download.php?f=test.php 
    // http://website.com/download.php?f=test.js 
?> 
+0

完美!我会给它一个镜头。 – qwerty 2010-05-21 14:55:29

+0

为什么这会降低投票率?对我来说这似乎是个好主意! – Josh 2010-05-21 15:00:11

+1

-1,因为提供的脚本将允许任何访问者通过提供一个简单的URL(即f = ../your_webroot_folder/index.php)来下载您网站的任何源文件。您必须首先清理输入(以防止访客从您指定的文件夹中逃出)。该解决方案背后的想法是好的,实施是不安全的地狱...... – wimvds 2010-05-21 15:01:38

-1

您可以更改上传的文件扩展名,如

my-file.php.txt 
my-file.js.txt 

假设.txt文件鸵鸟政策得到由PHP的服务器上处理...

+0

Aaaah,好主意。有什么聪明的方法来检查文件是否包含纯文本?像.php或.js文件一样?因为我不需要重命名诸如.txt或.jpg等所有扩展名。 – qwerty 2010-05-21 14:23:11

+0

我不知道是否有真正可靠的方法,但是您可以很容易地看到您的Web服务器将以PHP的形式处理什么扩展,因此这些扩展和例如.js应该足够了。 – jeroen 2010-05-21 14:35:16

+0

那么这也不是一个好主意,因为除PHP之外还有其他可以运行的脚本。所以如果用户上传一个JS脚本,它将运行。另一种方法是获取上传的文件exstention,然后将其与一个scriptfile-exstentions列表进行比较,如果匹配,则将“.txt”添加到文件名中?然而,我有问题找到一份清单。 – qwerty 2010-05-21 14:44:37