Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 导航到某个目录时是否忽略该目录中的脚本文件?_Php - Fatal编程技术网

Php 导航到某个目录时是否忽略该目录中的脚本文件?

Php 导航到某个目录时是否忽略该目录中的脚本文件?,php,Php,我目前正在用PHP编写一个文件上传sript,但我有点卡住了。用户可以上传PHP和JS等文件,但我不希望在用户尝试下载时运行脚本。是否可以使用htaccess或其他方法阻止该操作?您可以更改上载的文件扩展名,如 my-file.php.txt my-file.js.txt 假设服务器上的php无法处理.txt文件…您可以更改上载的文件扩展名,如 my-file.php.txt my-file.js.txt 假设服务器上的php无法处理.txt文件…您可以编写一个包装器php文件,将文件内容发

我目前正在用PHP编写一个文件上传sript,但我有点卡住了。用户可以上传PHP和JS等文件,但我不希望在用户尝试下载时运行脚本。是否可以使用htaccess或其他方法阻止该操作?

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

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

假设服务器上的php无法处理.txt文件…

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

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

假设服务器上的php无法处理.txt文件…

您可以编写一个包装器php文件,将文件内容发送到浏览器。但首先,您必须确保上传的文件存储在web根目录之外,这样就不会有人通过浏览器无意或以其他方式访问它们

包装器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
?>

您可以编写一个包装器php文件,将文件内容发送到浏览器。但首先,您必须确保上传的文件存储在web根目录之外,这样就不会有人通过浏览器无意或以其他方式访问它们

包装器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
?>


aaah,好主意。有没有什么聪明的方法来检查文件是否包含纯文本?像.php或.js文件?因为我不需要重命名所有的扩展名,比如.txt或.jpg。我不知道是否有真正可靠的方法,但您可以很容易地看到您的web服务器将处理哪些扩展名为php,所以这些扩展名和例如.js就足够了。这也不是一个好主意,因为除了php之外,还有其他脚本可以运行。因此,如果用户上传JS脚本,它将运行。另一种方法是抓取上传的文件exstention,然后将其与scriptfile exstentions列表进行比较,如果匹配,则在文件名中添加“.txt”?但是,我在查找列表时遇到问题。不,可以运行哪些脚本并不重要:重要的是服务器在将输出发送到浏览器之前将处理哪些脚本。例如,一个.js文件将显示在Firefox中,并在IE中触发一个下载对话框,只需在您的服务器上输入一个.js文件的任何url即可。有没有什么聪明的方法来检查文件是否包含纯文本?像.php或.js文件?因为我不需要重命名所有的扩展名,比如.txt或.jpg。我不知道是否有真正可靠的方法,但您可以很容易地看到您的web服务器将处理哪些扩展名为php,所以这些扩展名和例如.js就足够了。这也不是一个好主意,因为除了php之外,还有其他脚本可以运行。因此,如果用户上传JS脚本,它将运行。另一种方法是抓取上传的文件exstention,然后将其与scriptfile exstentions列表进行比较,如果匹配,则在文件名中添加“.txt”?但是,我在查找列表时遇到问题。不,可以运行哪些脚本并不重要:重要的是服务器在将输出发送到浏览器之前将处理哪些脚本。例如,一个.js文件将显示在Firefox中,并在IE中触发一个下载对话框,只需在服务器上输入一个.js文件的url即可。可能重复的是,PHP是我现在唯一需要担心的脚本语言吗?对不起,我应该将该链接作为注释。虽然PHP是您提到的唯一服务器端脚本。不,我也提到了Javascript。我不知道这是不是服务器端脚本,呵呵。但是我希望用户能够运行任何脚本文件。可能的重复。那么,PHP是我现在唯一需要担心的脚本语言吗?对不起,我应该把这个链接作为一个注释。虽然PHP是您提到的唯一服务器端脚本。不,我也提到了Javascript。我不知道这是不是服务器端脚本,呵呵。但我希望用户能够运行任何脚本文件。完美!!我将试一试。-1因为提供的脚本将允许任何访问者通过提供一个简单的URL(即f=../your_webroot_folder/index.php)下载您站点的任何源文件。您必须首先清理输入(以防止访问者从您指定的文件夹中逃出)。解决方案背后的想法是好的,实现是非常不安全的…例如,如果用户上传图像会发生什么?这会以纯文本形式显示吗?不过wimvds有一个观点。天哪,我现在感觉像是在发垃圾邮件!我将通过创建一个至少包含ID和文件名(完整路径或仅包含文件名,具体取决于存储上传内容的方式)的表来解决不安全问题。并将ID传递给下载脚本,这将尽可能安全。首先检查ID是否存在,如果确实存在,则检查文件是否仍然存在,并执行readfile,如果ID不存在或文件不再存在,则显示错误消息。但永远不要把脚本放在在线上面!完美的我将试一试。-1因为提供的脚本将允许任何访问者通过提供一个简单的URL(即f=../your_webroot_folder/index.php)下载您站点的任何源文件。您必须首先清理输入(以防止访问者从您指定的文件夹中逃出)。解决方案背后的想法是好的,实现是非常不安全的…例如,如果用户上传图像会发生什么?这会以纯文本形式显示吗?不过wimvds有一个观点。天哪,我现在感觉像是在发垃圾邮件!我将通过创建一个至少包含ID和文件名(完整路径或仅包含文件名,具体取决于存储上传内容的方式)的表来解决不安全问题。并将ID传递给下载脚本,这将尽可能安全。首先检查ID是否存在,如果确实存在,则检查文件是否仍然存在,并执行readfile,如果ID不存在或文件不再存在,则显示错误消息。但永远不要把脚本放在在线上面!