如何防止通过 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>
经过一些理解,我得到了解决方案。这是一个两步解决方案
- 禁用目录浏览(默认情况下禁用)
- 随机命名您的文件,这样就无法猜测文件的完整路径。
解决这个问题的一个简单方法是向图像添加哈希 url。
许多 CMS 通过混淆 URL 来类似地解决这个问题,他们在其中创建哈希 (md5) 或 SHA 并将其附加在文件名之前,例如:
/httpdocs/images/user1_id/043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89_file_name.jpg
在内部,您最终会在数据库中保存哈希值+文件名,而不仅仅是文件名。
下一步显然是禁用对 the apache htaccess 内文件列表的访问。
我必须设计一个网站,拥有帐户的用户可以上传图片。许多用户会上传他们的图片,而这些图片只需要所有者在他们的帐户中可见。
通常我们有像 /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>
经过一些理解,我得到了解决方案。这是一个两步解决方案
- 禁用目录浏览(默认情况下禁用)
- 随机命名您的文件,这样就无法猜测文件的完整路径。
解决这个问题的一个简单方法是向图像添加哈希 url。 许多 CMS 通过混淆 URL 来类似地解决这个问题,他们在其中创建哈希 (md5) 或 SHA 并将其附加在文件名之前,例如:
/httpdocs/images/user1_id/043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89_file_name.jpg
在内部,您最终会在数据库中保存哈希值+文件名,而不仅仅是文件名。
下一步显然是禁用对 the apache htaccess 内文件列表的访问。