php - 只允许某些用户访问某些文件夹/文件

标签 php apache .htaccess permissions web

我有一个 Weblication,它只允许某些用户访问某些页面。现在这些页面上有一些链接的文件。如果有人知道 URL,那么每个人都可以访问这些文件(在本例中是搜索引擎)。这应该改变!我怎样才能保护这样的目录?我想到了两种可能性:

  • htaccess:每次创建新用户时都输入用户名 + 密码 -> 不适合该类型的项目(还需要第二次登录)
  • download.php?file=xxx: 不知道如何在 Weblication 的所有链接(静态页面)中包含这样一个

还有其他可能吗?

最佳答案

摘自并翻译自this link (但仅在 WaybackMachine 中可用)。

借助 mod_rewrite 的个性化输出

借助函数 wCheckPermissionViewFile 可以对 php 文件进行个性化设置。在文件头中执行权限检查以抑制输出就足够了。如果需要个性化其他文件类型(例如 ZIP、PDF 等),可以使用 wPermission.cgi 或自定义 php 文件。

为了节省编辑器在每个指向二进制文件的个性化链接之前编写 wPermission.cgi 的工作,可以使用 Apache 模块 mod_rewrite。这样就可以在执行之前转换每个访问的链接。例如,您可以定义 wPermission.cgi 位于每个网络服务器调用之前。直接执行也可以在 php 文件的帮助下重定向(不需要 wPermission.cgi)。

通过 Perl (wPermission.cgi) 检查的 .htaccess 文件示例

#Alle Dateien mit angegebener Endung über wPermission.cgi aufrufen.
RewriteEngine on
RewriteCond %{REQUEST_URI} .pdf$ [NC,OR]
RewriteCond %{REQUEST_URI} .doc$ [NC,OR]
RewriteCond %{REQUEST_URI} .xls$ [NC,OR]
RewriteCond %{REQUEST_URI} .ppt$ [NC,OR]
RewriteCond %{REQUEST_URI} .pps$ [NC,OR]
RewriteCond %{REQUEST_URI} .zip$ [NC,OR]
RewriteCond %{REQUEST_URI} .jpg$ [NC,OR]
RewriteCond %{REQUEST_URI} .jpeg$ [NC,OR]
RewriteCond %{REQUEST_URI} .png$ [NC,OR]
RewriteCond %{REQUEST_URI} .gif$ [NC]
RewriteRule (.*) /cgi-bin/wPermission.cgi?file=/de/dokumente/$1

通过 PHP 检查的 .htacces 文件示例(例如 download.php,见下文)

#Alle Dateien mit angegebener Endung über die angegebene PHP-Datei aufrufen.
RewriteEngine on
RewriteCond %{REQUEST_URI} .pdf$ [NC,OR]
RewriteCond %{REQUEST_URI} .doc$ [NC,OR]
RewriteCond %{REQUEST_URI} .xls$ [NC,OR]
RewriteCond %{REQUEST_URI} .ppt$ [NC,OR]
RewriteCond %{REQUEST_URI} .pps$ [NC,OR]
RewriteCond %{REQUEST_URI} .zip$ [NC,OR]
RewriteCond %{REQUEST_URI} .jpg$ [NC,OR]
RewriteCond %{REQUEST_URI} .jpeg$ [NC,OR]
RewriteCond %{REQUEST_URI} .png$ [NC,OR]
RewriteCond %{REQUEST_URI} .gif$ [NC]
RewriteRule (.*) /de/download.php?path=/de/dokumente/$1

解释

如果您想个性化目录 /de/dokumente 中的所有 PDF 和 ZIP 文件而不更改链接,您可以将 .htaccess 文件放入该目录.在此文件中定义了重定向规则。

规则可以使用任意文件扩展名进行扩展,NC 代表不区分大小写。请注意,这些规则也会继承到子目录中。

二进制文件本身必须 checkin 并提供相应的个性化设置。

如果您想检查文件是否处于有效的发布时间段(例如在线或离线),请在通过 PHP API wIsOnline 进行权限检查之前进行检查。

示例:download.php 用于通过 PHP 检查实现“.htacces 文件(例如 download.php)”

<?php

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Dieses Skript erzwingt den Download von Dokumenten. PDF, DOC, XLS und PPT Dokumente werden je nach Browser angezeigt.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Einlesen der Weblication(r) 4.x API:
require_once ($_SERVER["DOCUMENT_ROOT"]."/weblication/lib/WAPI/WAPI.inc");

$filenameRel = str_replace("..", "", $_GET['path']);
$filename    = $_SERVER['DOCUMENT_ROOT'].$filenameRel;

if(preg_match("/\.\w+$/", $filename) && !preg_match("/\.(php|php5|php4|xml|xsl|cgi|pl)$/", $filename) && !preg_match("/\/weblication\//", $filename) &&  file_exists( $filename ) ){
  if(wCheckPermissionViewFile($filenameRel) == 1){
    header("Pragma: no-cache");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private", false);
    if(preg_match("/\.pdf/i", $filenameRel)){
      header("Content-Type: application/pdf");
    }
    else if(preg_match("/\.doc/i", $filenameRel)){
      header("Content-Type: application/msword");
    }
    else if(preg_match("/\.xls/i", $filenameRel)){
      header("Content-Type: application/msexcel");
    }
    else if(preg_match("/\.ppt/i", $filenameRel)){
      header("Content-Type: application/mspowerpoint");
    }
    else if(preg_match("/\.pps/i", $filenameRel)){
      header("Content-Type: application/mspowerpoint");
    }
    else if(preg_match("/\.jpg/i", $filenameRel)){
      header("Content-Type: image/jpg");
    }
    else if(preg_match("/\.jpeg/i", $filenameRel)){
      header("Content-Type: image/jpeg");
    }
    else if(preg_match("/\.png/i", $filenameRel)){
      header("Content-Type: image/png");
    }
    else if(preg_match("/\.gif/i", $filenameRel)){
      header("Content-Type: image/gif");
    }
    else{
      header("Content-Type: application/force-download");
      header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
      header("Content-Transfer-Encoding: binary");
      header("Content-Length: ".filesize($filename));
    }
    readfile($filename);
  }
  else{
    print "Permission Denied!";
  }
}
else {
  print 'Sorry, wrong path or file does not exist on the server!';
  print '<br/><a href="javascript:history.back();">back</a>';
}
exit;

?> 

对于更新版本的 Weblication this link有帮助。它是德语的,因为制造商的主要语言是德语。

关于php - 只允许某些用户访问某些文件夹/文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652591/

相关文章:

php - 在lumen 5.6应用中找不到驱动程序错误(在docker + alpine linux + nginx + php-fpm 7.2中运行)

php - 如何检查显示来 self 的服务器的图像的站点的 URL

php - 重定向后我想要我输入的网址

apache - RewriteEngine 每次都在 <IfModule mod_rewrite.c> 中打开?

php - 在 codeigniter 上只返回一条记录

php - 比较从数据库返回的值与 json 返回的值

php - mysql卡在内部连接查询

xml - ApacheFOP - 空白 PDF 输出?

apache - 在 apache hadoop 中读取或复制到 hdfs 时出现校验和异常

apache - .htaccess 中单个 RewriteCond 的多个 RewriteRules