使用PHP / Apache限制对静态文件(html,css,img等)的访问

2020/12/26 17:41 · php ·  · 0评论

可以说您的服务器目录中有很多html,css,js,img等文件。通常,Internet区域中的任何用户都可以通过输入完整的URL来访问这些文件,例如:http : //example.com/static-files/sub/index.html

现在,如果您只希望授权用户能够加载那些文件怎么办?对于此示例,假设您的用户首先从如下所示的URL登录:http : //example.com/login.php

您将如何允许登录的用户查看index.html文件(或“ static-files”下的任何文件),但将文件限制为其他所有人?

到目前为止,我已经提出了两种可能的解决方案:

解决方案1

在“静态文件”下创建以下.htaccess文件:

Options +FollowSymLinks  
RewriteEngine on  
RewriteRule ^(.*)$ ../authorize.php?file=$1 [NC]

然后在authorize.php中...

if (isLoggedInUser()) readfile('static-files/'.$_REQUEST['file']);
else echo 'denied';

这个authorize.php文件已经大大简化了,但是您知道了。

解决方案2

在“静态文件”下创建以下.htaccess文件:

Order Deny,Allow
Deny from all
Allow from 000.000.000.000

然后,我的登录页面可以为每个登录用户附加.htaccess文件和IP。显然,这还需要某种清除例程,以清除旧的或不再使用的IP。



我担心随着访问的用户和文件数量的增加,我的第一个解决方案在服务器上的价格可能会非常昂贵。
我认为我的第二个解决方案将便宜得多,但由于IP欺骗等原因,其安全性也将降低。我还担心,如果同时有许多用户,将这些IP地址写入htaccess文件可能会成为应用程序的瓶颈。

以下哪种解决方案听起来更好,为什么呢?另外,您能想到一个完全不同的解决方案,比其中任何一个都要好吗?

我会考虑使用PHP加载程序来处理身份验证,然后返回您需要的文件。例如,<img src='picture.jpg' /> 不要做类似的事情<img src='load_image.php?image=picture.jpg' />

您的图像加载器可以验证会话,检查凭据等,然后决定是否将请求的文件返回到浏览器。这将允许您将所有安全文件存储在Web可访问的根目录之外,因此没有人会仅WGET文件或“意外”浏览那里。

只要记住要在PHP中返回正确的头文件,并在php中执行类似readfile()的操作,这会将文件内容返回给浏览器。

我已经在几个大型安全网站上使用了此安装程序,它的工作原理很吸引人。

编辑:我当前正在构建的系统使用此方法来加载Javascript,图像和视频,但是我们对安全性不是很担心。

X发送文件

有一个Apache(和其他HTTP服务器)模块,可让您告诉HTTP服务器提供您在php代码的标头中指定的文件:因此,您的php脚本应类似于:

// 1) Check access rights code
// 2) If OK, tell Apache to serve the file
header("X-Sendfile: $filename");

2个可能的问题:

  1. 您需要访问重写规则(启用.htaccess或直接访问配置文件)
  2. 您需要将mod_xsendfile模块添加到已安装的Apache中

这是另一个线程的一个好答案:https :
//stackoverflow.com/a/3731639/2088061

我一直在思考同一问题。对于为每个已用完的小资源运行的PHP引擎,我同样感到不满意。几个月前我在这里同样的方式提出了一个问题,尽管重点不同。

但是我只是有一个非常有趣的想法,可能有用

  • /sessions在Web服务器上的某个位置维护一个目录

  • 每当用户登录时,请创建一个会话ID为的空文本文件/sessions例如123456

  • 在您的PHP应用中,提供如下图像: /sessions/123456/images/test.jpg

  • 在您的htaccess文件中,有两个重定向命令。

  • 转化 /sessions/123456/images/test.jpg/sessions/123456?filename=images/test.jpg

  • 第二个捕获任何调用,//sessions/(.*)并使用该-f标志检查指定文件是否存在如果/sessions/123456不存在,则表示用户已注销或会话已过期。在这种情况下,Apache发送403或重定向到错误页面-资源不再可用。

这样,我们就可以在mod_rewrite中进行准会话身份验证,只需执行一次“文件存在”检查!

我没有足够的例程来快速构建mod_rewrite语句,但是它们应该足够容易编写。(希望您朝@Gumbo的方向看:)

注意事项和警告:

  • 过期的会话文件必须使用cron作业快速删除,除非可以在.htaccess中检查文件的mtime(这很有可能)。

  • 只要会话存在,映像/资源就可用于任何客户端,因此没有100%的保护。您可以通过将客户端IP添加到公式(=创建的文件名)中,并另外检查%{REMOTE_ADDR}来解决此问题。这是高级的.htaccess精通工具,但我很确定它是可行的。

  • 资源URL不是静态的,并且每次登录时都必须检索,因此无需缓存。

对于对此的反馈,我可能忽略的任何不足或不可能以及任何成功的实现,非常感兴趣(我现在没有时间自己建立测试)。

创建一个重写映射,以验证用户的凭据并将其重定向到适当的资源或“拒绝访问”页面。

维护htaccess文件的内容似乎是一场噩梦。另外,您声明的目标是防止未经身份验证的用户(而非未经身份验证的客户端ip地址)访问此内容-因此该方法不适合此目的:

多个用户似乎来自同一IP地址

单个用户会话可能看起来来自多个地址。

我担心随着访问的用户和文件数量的增加,我的第一个解决方案在服务器上的价格可能会非常昂贵

如果要防止内容泄漏,并且不想使用HTTP身份验证,那么将所有文件访问包装在附加的逻辑层中是唯一明智的选择。另外,您不知道为此使用PHP一个问题-您是否测试过?我认为您会惊讶于它可以提供多少吞吐量,特别是如果您使用操作码缓存。

我猜您对包装程序的“简化”解决了mime类型和缓存之类的问题。

C。

我编写了一个动态Web应用程序并将其部署在Webshere Application Server上,这是保护静态文件的方式:

我首先添加

<login-config id="LoginConfig_1">
  <auth-method>FORM</auth-method>
    <realm-name>Form-Based Authentication</realm-name>
      <form-login-config>
        <form-login-page>/login.html</form-login-page>
        <form-error-page>/login_error.html</form-error-page>
       </form-login-config>
</login-config>

在web.xml中,它将告诉您的网络服务器使用基于表单的身份验证(下面提供了用于登录的代码)。

登录页面的代码:

<form id="form1" name="form1" method="post" action="j_security_check" style="padding: 0px 0px 0px 12px;">
        Username: 
          <label>
          <input name="j_username" type="text" class="font2" />
        </label>

        <br />
        <br />
        Password:
        <span class="font2" >
        <label>
      <input name="j_password" type="password" class="font2" />
      </label>
      </span> 
        <br />
        <br />
            <label>
        <input type="submit"  class="isc-login-button" name="Login" value="Login" />
        </label>
    </form></td>

要进行基于表单的登录,您必须将Web服务器配置为使用特定的用户注册表,可以是LDAP或数据库。

您可以声明安全资源,并且每当用户尝试访问这些资源时,容器都会自动检查用户是否已通过身份验证。即使您也可以使用安全资源附加角色。为此,我在web.xml中添加了以下代码

<security-constraint>
        <display-name>Authenticated</display-name>
        <web-resource-collection>
            <web-resource-name>/*</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>PUT</http-method>
            <http-method>HEAD</http-method>
            <http-method>TRACE</http-method>
            <http-method>POST</http-method>
            <http-method>DELETE</http-method>
            <http-method>OPTIONS</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Auth Roles</description>
            <role-name>role1</role-name>            
            <role-name>role2</role-name>            
        </auth-constraint>
    </security-constraint>

    <security-role>
        <role-name>role1</role-name>
    </security-role>
    <security-role>
        <role-name>role2</role-name>
    </security-role>

因此,此代码将不允许用户看到任何静态文件(自/ *开始),直到他以角色role1和role2登录。因此,通过这种方式,您可以保护您的资源。

如果您使用的是apache,则可以在.htaccess或httpd.conf文件中进行如下配置。下面是防止访问* .inc文件的示例。它对我很有用。

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

有关更多详细信息,请参阅:http : //www.ducea.com/2006/07/21/apache-tips-tricks-deny-access-to-certain-file-types/

假设您要保护所有静态文件并且必须从webroot内部对其进行服务器处理,则可以保护除HEAD之外的所有HTTP方法。如果获得授权,则可以通过标头发送头请求,并将文件内容作为正文发送。当然这很昂贵,但是您受到保护并且行为相同。

我可能有一个基于iframe的建议HTTP_REFERER,但它不是防弹,这将取决于你想要保护这个访问什么。

但是,如果要防止在没有身份验证的情况下显示完整的静态页面,则可以执行以下操作:

1-使用PHP页面验证用户身份

2-重定向到另一个PHP页面,该页面包含URL中的键和链接到正文中静态内容的iframe:

<iframe src="static/content.html" />

3-然后在htaccess中,您可以像这样检查HTTP_REFERER内部的密钥:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !AUTH_KEY
RewriteCond %{REQUEST_URI} ^/path/to/protected/page$
RewriteRule . - [F]

4-最后,如果您想使其更具动态性,并且每次都不rewrite map按Ignacio Vazquez-Abrams的答案所建议的那样使用相同的KEY,或者使用用户IP作为文件名创建文件,并使用以下命令检查文件是否存在,请REMOTE_ADDR删除一段时间后归档。

但是请记住,从一个浏览器会话到另一个浏览器会话以及REMOTE_ADDR,iframe + HTTP_REFERER行为可能有所不同,因此它的局限性...

本文地址:http://php.askforanswer.com/shiyongphp-apachexianzhiduijingtaiwenjianhtmlcssimgdengdefangwen.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!