Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP/Apache根据DB值控制对文件的访问 我想要什么_Php_Apache_File_Access Control - Fatal编程技术网

使用PHP/Apache根据DB值控制对文件的访问 我想要什么

使用PHP/Apache根据DB值控制对文件的访问 我想要什么,php,apache,file,access-control,Php,Apache,File,Access Control,我正在制作一个系统,当用户上传图像时,它会进入文件夹images,其中有两个图像副本,一个拇指和一个更大的 现在,当用户上传一个图像时,会在MySQL数据库中插入一行,该行获取一个id,该行保存一个值,该值确定图像是否可供公众使用(1表示仅可用,2表示两者都可用)以及图像的所有者(管理员) 我不想做的是,如果用户试图通过访问图像的URL来访问该图像,而数据库中的值表示该图像不应公开,并且该用户的会话不是该图像的所有者,(管理员未登录),则应表示未找到图像或访问被拒绝 我想象的 如果可以用php实

我正在制作一个系统,当用户上传图像时,它会进入文件夹
images
,其中有两个图像副本,一个拇指和一个更大的

现在,当用户上传一个图像时,会在MySQL数据库中插入一行,该行获取一个id,该行保存一个值,该值确定图像是否可供公众使用(1表示仅可用,2表示两者都可用)以及图像的所有者(管理员)

我不想做的是,如果用户试图通过访问图像的URL来访问该图像,而数据库中的值表示该图像不应公开,并且该用户的会话不是该图像的所有者,(管理员未登录),则应表示未找到图像或访问被拒绝

我想象的 如果可以用php实现,我可以想象如下:

//User tries to go to URL "images/IMAGE-ID_thumb.jpg"
if($img['access'] >= 1 || $_SESSION['admin_ID'] == $img['owner_ID']) {
  //Show image thumb
}
else {
  //Access denied
}
我可以将图像隐藏在.htaccess保护的文件夹中,制作一个imgae_get.php,它接受URL变量,查看图像是否可用,如果可用,则加载图像。我只是想避免对映像和其他服务器耗电过程进行反编译/重新编译

我的问题是,我能像这样控制图像吗?有没有办法使php脚本显示为它内部加载的图像?
或者有没有比通过PHP更好的方法?(可能是Apache?)非常感谢您的任何建议。

您可以使用
DocumentRoot中的“.htaccess”文件重定向对某些文件类型(或文件名,任何可以正则表达式的内容)的所有请求:

//get_image.php

//Do session/mysql checks as outlined in your code above.

header("Content-Disposition: filename=$imagename.$filetype");
header("Content-type: $mimetype");
readfile(PROTECTED_IMAGE_FOLDER . "$imagename.$filetype");
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule \.(gif|jpg|jpeg|png)$ imageHandler.php [NC,L]
您可以确定来自
$\u服务器的原始请求
superglobal,并使用适当的标题提醒浏览器您正在返回图像。然后,您从磁盘读取图像(使用
file\u get\u contents()
或类似工具),并使用
echo
将其写入浏览器,与输出HTML的方式相同。

“mod\u rewrite”所有试图通过一个假路径名访问图像的PHP文件,并将图像文件名作为查询参数,然后在那里执行您的魔术。将图像存储在公用文件夹之外应防止任何不必要的公共访问。或者将实际图像存储在数据库本身中。

.htaccess

#mod_rewrite
RewriteRule ^(.*)_(full|thumb).(jpg|png|gif)$ image.php?i=$1&type=$2&ext=$3
HTML


=
PHP(image.PHP)


谢谢,将您的答案与@tandu的答案结合起来将是我的最终解决方案,实际上也将php隐藏在后面,不让用户知道+1 :)
<img src="http://example.com/image-1_thumb.png" />
=
<img src="image.php?i=image-1&type=thumb&ext=png" />
<?php 
// do basic sanity checks on input
$_GET['i'] = isset($_GET['i']) ? basename($_GET['i']) : null;
$_GET['type'] = isset($_GET['type']) ? basename($_GET['type']) : null;
//unsafe way
//$_GET['ext'] = isset($_GET['ext']) ?  basename($_GET['ext']) : null;
//safe way
$_GET['ext'] = in_array($_GET['ext'], array('png','gif', 'png')) ? $_GET['ext'] : null;

## Do DB Checks on session to owner ect 
/* $_GET
    [i] => image-1
    [type] => thumb
    [ext] => png
*/

// then output
if (file_exists('hiddenimagesfolder/images/'.$_GET['i'].'_'.$_GET['type'].'.'.$_GET['ext'])) {
    header("Content-Type:image/png");
    readfile('hiddenimagesfolder/images/'.$_GET['i'].'_'.$_GET['type'].'.'.$_GET['ext']);
} else {
    //not found
}
?>