如何防止通过 apache 服务器上的 public 目录访问数据

How to keep data secured from access via a public directory on apache server

我必须设计一个网站,拥有帐户的用户可以上传图片。许多用户会上传他们的图片,而这些图片只需要所有者在他们的帐户中可见。

通常我们有像 /httpdocs/images/user1_id/file_name.jpg/httpdocs/images/user2_id/file_name.jpg 这样的 Web 目录结构,但这带来了任何知道 public 文件目录结构的人都可以访问完整图像目录的安全问题。

如何解决这个安全问题?


你可以看看这个link,它解释了一个与你的问题非常相似的问题。

示例虚拟主机:

<VirtualHost *:80>
    ServerName docs.maze.io
    DocumentRoot /export/docs
    <Directory /export/docs>
        # No .htaccess allowed
        AllowOverride None

        # Authenticate through LDAP
        AuthType basic
        AuthName "docs area"
        AuthBasicProvider ldap
        AuthLDAPBindDN "userid=apache,dc=maze,dc=io"
        AuthLDAPBindPassword "secret"
        AuthLDAPURL "ldaps://ldap.net.maze.io/dc=maze,dc=io"
        AuthLDAPGroupAttribute memberUid
        AuthLDAPGroupAttributeIsDN off
        Require ldap-group cn=docs,ou=Groups,dc=maze,dc=io

        # Enable WebDAV
        DAV On
    </Directory>

    # Restrict /home/* to /home/%{REMOTE_USER} access only
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/home/(?:|README\.x?html?|index\..+)$
    RewriteRule ^.* - [L]
    RewriteCond %{LA-U:REMOTE_USER} ^(.+)
    RewriteCond %1:/home/ !^([^:]+):/home/$
    RewriteRule ^/home/([^/]+) - [F,L]
</VirtualHost>

经过一些理解,我得到了解决方案。这是一个两步解决方案

  1. 禁用目录浏览(默认情况下禁用)
  2. 随机命名您的文件,这样就无法猜测文件的完整路径。

解决这个问题的一个简单方法是向图像添加哈希 url。 许多 CMS 通过混淆 URL 来类似地解决这个问题,他们在其中创建哈希 (md5) 或 SHA 并将其附加在文件名之前,例如:

/httpdocs/images/user1_id/043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89_file_name.jpg

在内部,您最终会在数据库中保存哈希值+文件名,而不仅仅是文件名。

下一步显然是禁用对 the apache htaccess 内文件列表的访问。