繁体   English   中英

只允许PHP脚本打开网址,如www.mydomain.com/topsecret/1/001.jpg

[英]only allow PHP scripts to open urls like www.mydomain.com/topsecret/1/001.jpg

我运行一个Web应用程序,将用户上传的文件存储在以下文件夹结构中:

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

现在,很容易猜到003.jpg和004.jpg的网址......

因此,我想限制用户只能访问www.mydomain.com/app/,而不是其他任何内容。 只允许我在localhost上的.php页面获取最高机密的pdf,比如

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

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

先谢谢你,马蒂亚斯

这可能是您正在寻找的:

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

order deny,allow
allow from 127.0.0.1
deny from all

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

一些澄清:当你做一个

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

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

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

在.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]

您可以嵌入在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) ... <? if ($isAdmin) ... - 如果用户是管理员,用户仍然可以看到这段代码 - >他也可以猜到其他文件名...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM