我正在尝试建立一个网站,让用户拥有自己的创意空间,任何人都可以看到所述空间。问题在于这些用户可能会通过访问父文件夹来入侵我的网站。我想知道是否有办法确保这些文件夹的排他性。
以下是我提到的结构:
parent/
child1/
file1
file2
folder/
image
child2/
file
我只想确保child1中的文件只能访问child1中的其他文件。表示file1可以访问文件夹/图像,但不能访问../child2/file
或../../other_file
另外,我使用PHP。
因此,显然不可能使用htaccess做到这一点。相反,我应该使用ftp或cpanel。这就是所有的人!
mod_Rewrite
隐藏PHP文件位置。file_get_contents()
将文件呈现为本地文件。 例如;让我们看看Instagram;他们使用上述系统的复杂版本。
这是instagram图片:
您看到图像文件之后的所有内容吗?
这些是跟踪器和定义。这些用于确保加载的图像正确无误;如果您加载没有这些内容的URL,则会得到:
哪个给您:
"Bad URL Timestamp"
因为.jpg文件是不是JPEG。它是一个冒充核心文件的PHP文件,该文件名也不存在,但实际上用于生成.htaccess
mod_rewrite,
so:
请求:/myfolder/20987296_218244025372607_4512699619393667072_n.jpg
是
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/myfolder/([0-9]+)_([0-9]+)_([0-9]+)_n.jpg$ /imageProcessor.php?image=$1&var2=$2&var3=$3 [NC,L,QSA]
PHP文件imageProcessor.php
看起来类似于:
<?php
// headers
Header("content-type: image.jpeg");
// validate $_GET data and
if(is_numeric($_GET['image']) && $_GET['oh'] > (time() - 3600) ){
// check database of values; such as if this image is visible
$imageData = $DatabaseObject->getImage((int)$_GET['image']);
// Load the result file path from the database
if(file_exists($imageData['user_folder'])){
// load the file with file_get_contents
$image = file_get_contents($imageData['image_path']);
}
print $image;
因此,您可以构建一个完整的系统,从而使用户和浏览器在前端看到的内容与服务器上实际发生的一切完全不同;您可以根据用户的帐户值将用户包含在由数据库属性定义的某些空间中。
上面是一个非常简单的示例,但是核心概念应该足以让您入门,如何基于文件夹对用户进行身份验证可以是:
用户登录哈希可以是该用户登录时生成的固定长度的任何字符串,并且在数据库中是唯一的。可以在文件名或查询字符串中使用此字符串来标识用户,但是$_SESSION
数据要可靠得多,并且可以更秘密。
所以$_SESSION['login_hash'] = "randomGeneratedCodeX";
user_id | user_name | user_folder | user_login_hash
------------------------------------------------------------
1 | userA | mark | randomGeneratedCodeX
2 | userB | jason | randomCodeGeneratedZ
因此,当用户访问/myfolder/234_464_7681.jpg
时,Mod_rewrite实际上将访问/imageProcessor.php?image=234....
然后您的代码可以在数据库中查找并比较$_SESSION
哈希是否比较;并找到文件夹:
SELECT user_folder FROM `users_table` WHERE user_login_hash = :sessionString
$_SESSION['login_hash'] === :sessionString
。然后您可以检查图像是否存在:
$imagePath = "/path/to/data/folders/".$imageData['user_folder']./".$_GET['image'].".jpg";
if(file_exists($imagePath)){
//File exists so load it into PHP and outpout the image to the browser!
print file_get_contents($imagePath);
}
请注意您应该使用基本的.htaccess
来停止浏览器对数据文件的直接访问,或者将文件存储在public_html
目录的外部,以便从浏览器无法访问它:] >
例如:
文件:/yourServerAccount/path/to/data/folders/mark/234.jpg
URL:/yourServerAccount/public_html/imageProcessor.php
因此,这可以为您的每个用户提供自己的伪空间,并且当他们以一个用户身份登录时,将被硬编码为无法从另一个用户目录加载数据。
以上仅是一个非常简单且不完善的示例。
您需要阅读上面介绍的概念和诀窍。