如何将文件夹放入无法访问其外部其他内容的孤立空间(PHP)

问题描述 投票:-1回答:2

我正在尝试建立一个网站,让用户拥有自己的创意空间,任何人都可以看到所述空间。问题在于这些用户可能会通过访问父文件夹来入侵我的网站。我想知道是否有办法确保这些文件夹的排他性。

以下是我提到的结构:

parent/
  child1/
     file1
     file2
     folder/
     image
  child2/
     file

我只想确保child1中的文件只能访问child1中的其他文件。表示file1可以访问文件夹/图像,但不能访问../child2/file../../other_file

另外,我使用PHP。

php file .htaccess directory-structure
2个回答
0
投票

因此,显然不可能使用htaccess做到这一点。相反,我应该使用ftp或cpanel。这就是所有的人!


0
投票

简短;

  • 使用数据库控制身份验证。
  • 使用mod_Rewrite隐藏PHP文件位置。
  • 将用户数据文件存储在服务器帐户公共区域之外。
    • 首先绝对清洁上传的用户文件!!
  • 使用PHP标头和file_get_contents()将文件呈现为本地文件。

下面仅是处理此广泛主题的一种方法的示例

例如;让我们看看Instagram;他们使用上述系统的复杂版本。

这是instagram图片:

https://instagram.flhr1-2.fna.fbcdn.net/v/t51.2885-15/e35/20987296_218244025372607_4512699619393667072_n.jpg?_nc_ht=instagram.flhr1-2.fna.fbcdn.net&_nc_cat=111&_nc_ohc=LwKoP3yHB_AAX-QA9yR&oh=d6d19ba6381de558e7260f44897f6010&oe=5E8FE8D7

您看到图像文件之后的所有内容吗?

  • _ nc_ht
  • _ nc_cat
  • _ nc_ohc

这些是跟踪器和定义。这些用于确保加载的图像正确无误;如果您加载没有这些内容的URL,则会得到:

https://instagram.flhr1-2.fna.fbcdn.net/v/t51.2885-15/e35/20987296_218244025372607_4512699619393667072_n.jpg

哪个给您:

"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";

MySQL:

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

因此,这可以为您的每个用户提供自己的伪空间,并且当他们以一个用户身份登录时,将被硬编码为无法从另一个用户目录加载数据。

以上仅是一个非常简单且不完善的示例。

您需要阅读上面介绍的概念和诀窍。

书目:

  • PHP, display image with Header()

  • Prevent direct access to a php include file

  • © www.soinside.com 2019 - 2024. All rights reserved.