Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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_.htaccess - Fatal编程技术网

如何保护php文件和下载文件链接

如何保护php文件和下载文件链接,php,.htaccess,Php,.htaccess,我使用下面的代码来保护zip文件的直接下载链接 代码是否足以保护直接下载链接。我不希望链接通过IDM或其他下载管理器可见 现在,若我在调用上面的php代码时并没有输入id或输入wring代码,服务器将发送php文件,其中包含一些错误,说明找不到指定的文件。但该文件揭示了文件的实际位置。在这种情况下如何保护php文件。在htaccess文件中有什么我可以做的吗 我是php的新手。 谢谢我建议修改您现有的代码,这样一旦建立了文件名,您就可以检查文件是否存在,如果不存在,就会出现HTTP 404错

我使用下面的代码来保护zip文件的直接下载链接


代码是否足以保护直接下载链接。我不希望链接通过IDM或其他下载管理器可见

现在,若我在调用上面的php代码时并没有输入id或输入wring代码,服务器将发送php文件,其中包含一些错误,说明找不到指定的文件。但该文件揭示了文件的实际位置。在这种情况下如何保护php文件。在htaccess文件中有什么我可以做的吗

我是php的新手。
谢谢

我建议修改您现有的代码,这样一旦建立了文件名,您就可以检查文件是否存在,如果不存在,就会出现HTTP 404错误

下面是对上述代码进行更改的大致概述,以从:

$path = "directory/{$filename}.zip";
if(!file_exists($root . '/' . $path)) {
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}
$path=“directory/{$filename}.zip”;
如果(!file_存在($root.'/'.$path)){
标头(“未找到HTTP/1.0 404”);
回显“404未找到”;
echo“找不到您请求的页面。”;
退出();
}

您会注意到我在其中添加了一个$root变量。这需要设置站点文档根目录的完整路径,因为file_exists函数需要一个完整的文件系统路径(而不仅仅是相对路径)。

我认为最好将目录从apache文档根目录移出(如果可以的话) 或者也可以在目录/.htaccess中使用.htaccess禁用该目录

全盘否定

就像这里:

如果要隐藏错误消息,可以在php中使用error_reporting(0)(或函数前的@符号) 或者只检查文件是否存在(…)

但首先,为了安全起见,您必须解析输入数据, 因为如果您的url是这样的:?id=../../filename任何人都可以从您的服务器下载任何文件

例如,您必须至少删除。。输入中的字符串:

$filename = str_replace('..', '', $filename);

如果不这样做,$_GET['id']='../filename.ext',则$path将是'directory/./filename.ext',这可能很危险

为什么有人知道位置很重要?如果您想保护访问,那么要求身份验证将是一个更好的选择。如果您不想让人们在不通过脚本的情况下下载文件,则文件本身应该在web空间之外。我尝试了完整路径(如在xampp上使用),但file_exist函数始终返回false。不知道为什么?所以您要查找的路径不是域,或者“localhost”是文件本身所在的服务器存储位置。因此,在Unix下,这可能类似于/var/www/sitename/htdocs/或者在windows上可能是D:/websites/sitename/documents/等等。您可以使用预先设置的$\u服务器变量访问路径,但这并不总是准确的。尝试将$root替换为$\u SERVER['DOCUMENT\u root'],看看是否有帮助。谢谢,伙计。请详细说明关于解析输入数据的最后几行。我没有得到。。。好了。如果您在/var/www/中,并且您的路径是
$path='dir/'$文件名
但是,
$filename=='../../../etc/passwd'
则用户将拥有您的/etc/passwd文件