仅允许某些用户访问某些文件夹/文件


allow access to certain folder/files only for some users

>我有一个Weblication,它只向某些用户提供对某些页面的访问。现在这些页面上链接了一些文件。如果有人拥有URL,则每个人都可以访问这些文件(在本例中为搜索引擎(。这应该改变!如何保护这样的目录?我想到了两种可能性:

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

还有其他可能性吗?

从此链接获取和翻译(但仅在WaybackMachine中可用(。

借助

mod_rewrite实现个性化输出

借助该功能wCheckPermissionViewFile php文件可以个性化。在文件头中执行权限检查以禁止输出就足够了。如果其他文件类型需要个性化(例如.ZIP PDF,...(,则可以使用wPermission.cgi或自定义php文件。

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

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

#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文件的示例(例如下载.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

解释

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

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

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

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

示例:下载.php用于实现" 通过从 PHP 检查.htacces文件(例如下载.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此链接可能会有所帮助。它是德语,因为制造商的主要语言是德语。

您可以将所有文件存储在非公共目录中,然后编写一个页面(就像您使用 download.php?file=xxx 所说的那样(来检查用户是否有权访问该文件,然后输出到浏览器。

编辑:

当您使用 CMS 时,我认为用户有一个很好的 GUI,他们可以单击它来选择他们想要插入/链接到的文件?如果是这种情况,您可能会找到它用于创建链接的代码,然后在文件名前面加上http://www.whatever.com/download.php?file=,然后通过脚本路由下载。