4

我运行一个网络应用程序,将用户上传的文件存储在一个文件夹结构中,例如:

www.mydomain.com/uploads/topsecret/1/001.jpg
www.mydomain.com/uploads/topsecret/1/002.jpg

现在,很容易猜出 003.jpg 和 004.jpg 的 url ...

因此,我只想限制用户访问 www.mydomain.com/app/,而不是其他任何内容。只有我在本地主机上的 .php 页面应该被允许访问最高机密的 pdf,比如

show.php:
<? if ($isAdmin) {
    echo "<img src='http://www.mydomain.com/uploads/topsecret/1/001.jpg'/>";
 } ?>

也许有一个通过 .htaccess 或通过文件夹权限的解决方案。我知道我可以通过“headers”和“readfile”来解决这个问题,但是现在这会导致一些重构。

提前谢谢你,马蒂亚斯

4

5 回答 5

3

这可能是您正在寻找的:

将包含此内容的 .htaccess 文件放在您不希望用户能够访问的文件夹的根目录中:

order deny,allow
allow from 127.0.0.1
deny from all

这仍将允许从 Web 服务器上的 Web 浏览器访问 url,但尝试从任何其他计算机访问它们将导致 403 错误。

于 2012-09-18T18:49:43.367 回答
1

一些澄清:当你做一个

echo "<img src='....'>";

PHP 访问无关紧要(事实上,即使 PHP 无权访问该文件,它也可以工作!)。第一步是要意识到,是浏览器发出了对图像的请求。所以如果浏览器可以访问它,用户就可以通过猜测图像的名称来访问其他图像。如果您使用 PHP 中的 readfile 提供图像,这甚至会起作用。这就是为什么我写道你试图以错误的方式解决问题。

可以做的是混淆图像名称(或您发送到 PHP 脚本的请求变量)。例如:使用盐 + MD5。这样用户就无法猜测名称。

于 2012-09-19T01:08:24.310 回答
0

在 .htaccess 中使用:

<FilesMatch "\.(engine|inc|jpg|po|sh|.*sql|theme|tpl(\.php)?|xtmpl|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$">
  Order allow,deny
</FilesMatch>

这将保护文件不被直接访问,然后例如设置您的默认 index.php 文件来处理 $_GET 请求:

 RewriteBase /

  # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
于 2012-09-18T15:09:11.840 回答
0

您可以嵌入以 base64 编码的图像,如下所示:

<img src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPb
WLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVr
ApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KT
kpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxM
AF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=
" alt="British Blog Directory" width="80" height="15" />

您想要使用的方式<? if ($isAdmin) ...- 如果他是管理员,用户仍然可以看到这段代码 -> 他也可以猜测其他文件名......

这是一个链接:http ://www.sweeting.org/mark/blog/2005/07/12/base64-encoded-images-embedded-in-html

于 2012-09-18T15:14:55.700 回答
0

如果允许,请在脚本中使用 readfile() 向用户显示图像。并正确阻止通过 .htaccess / chmoded 访问实际文件

于 2012-09-19T01:11:04.100 回答