当用户上传图像时,我将其保存到htdocs目录中的图像文件夹中。所以任何没有登录网站的用户都可以输入url / images /“name”来获取它。什么是防止这种情况的最佳方法。因为浏览只是请求就像用户直接在地址栏中键入图像的位置一样。 我想在检查会话详细信息后使用脚本从目录下载每个图像文件。你认为这会是一个好方法,如果你能建议我一个脚本。 我不想使用数据库。我认为这会很慢。或者,如果这是更好的方法让我知道。
THnks
答案 0 :(得分:8)
你可以将它放在htdocs /目录之外,并将images / dir mod_rew到image.php或其他东西。所以url / images / test.jpg会转换为image.php?path = test.jpg
image.php可能如下所示:
<?php
if($loggedin) {
header("Content-Type: image/jpeg");
echo file_get_contents("../images/".$_GET["path"]);
}
?>
不要忘记清理输入!您不希望用户访问任意文件。
答案 1 :(得分:3)
我建议不要使用echo file_get_contents(...)
而是建议使用fpassthru来避免大文件可能出现“内存不足”错误。
答案 2 :(得分:1)
是的,你可以有一个image.php文件,它只是在最后添加用户ID并显示图像。实际上并没有那么多代码。
示例在readfile()文档中。但是,下载图像时,您可以跳过附件标题并使用内容类型标题。
您可以将图像位置保存在数据库中,这样就不会慢......因为我不建议将纯图像数据存储在数据库中
答案 3 :(得分:0)
如果您没有使用身份验证库,我会使用$ _SESSION来跟踪用户是否已登录,但也会创建指纹,以便更难以劫持会话:
$ _SESSION['loggedIn'] = 1;
是一种不好的方法,因为我可以通过?PHPSESSID = 933883&amp; loggedIn = 1并基本上欺骗应用程序。
$_SESSION['userid'] = 100;
$_SESSION['fingerprint'] = jskdskjdjdk48924829dkshjdkshdjkhsdjsd;
'指纹'是带有盐的MD5加密字符串,例如。用户名+密码+“你想要的任何字符串”,只有你知道。您可以在登录时创建指纹,并具有一个功能,可以验证存储在关键代码周围的会话中的指纹。这是一个基本的示例,当您对PHP更加熟悉时,您可以使用许多PHP框架(如CakePHP)中存在的更好的auth模块。
答案 4 :(得分:0)
当他们登录时,设置一个cookie
然后在readimg.php中检查cookie
然后输入readimg.php?i = img.png
让readimg.php只检查图像的特定文件夹
答案 5 :(得分:0)
这就是我在这里做的事情:
http://numetrocontent.co.za/basic_movie_info.php?movieid=0412
您看到的图像是存储在服务器上的文件的低分辨率版本,您无法看到。如果您已登录,则可以单击图像下载原始文件。如果你不是,你就做不到。但是,您可以为渲染设置任意分辨率,但这可以选择。