簡體   English   中英

訪問網站根PHP外部的文件夾

[英]Accessing folder outside of website root PHP

我正在使用一些共享主機,並且有幾個網站。 每個網站的根文件夾都在域管理器上定義。 如果可能的話,需要從不是我網站根文件夾的另一個文件夾訪問某些圖像。

我有一些文件夾結構

example
demo
pictures
  - 1.jpg
  - 2.jpg

一些網站www.example.com指向文件夾示例 ,但我在文件夾圖片中將某些圖像放在我的虛擬主機的根目錄中,文件夾圖片未使用某些域定義,我只能從FTP訪問它們。 對於www.example.com網站,我需要顯示圖片文件夾中的圖片。 我知道MODx Manager就是這樣工作的,我認為這是可能的,有人知道怎么做嗎?

這里的主要問題是PHP如何運行 ,即在哪個用戶下運行

情況1:您所有的網站都以同一用戶身份運行(例如miomir:apache)。

然后,您的任何站點都可以通過指定絕對或相對路徑(即.. / .. / ...)來訪問所有站點上的所有數據。 要從瀏覽器端提供該信息,您需要使用一個將采用URL的腳本,例如img.php?img = nameofimage,並使用不是從腳本目錄而是其他位置獲取的圖像進行答復。

您需要驗證用戶參數,以避免此技巧成為使您可以訪問網站上所有內容的漏洞。 例如,檢查文件是否存在,是否在適當的文件夾中(使用basename()剝離任何其他文件夾)以及是否是圖像(快速方法:getImageSize()),這還將使您能夠收集正確的MIME類型)。

情況2:您的網站分別由不同的用戶運行。

也就是說,www.example.com上的腳本以exampleuser:apache運行,www.foo.com由foouser:apache處理,依此類推。

在這種情況下,您無法自己做任何事情 ,如果有,那么相同的技巧將允許您閱讀任何其他客戶的網站,或者允許他們閱讀您的網站。 因此,您不想將自己的習慣帶給這樣的托管公司:這是一場災難,等待發生。

您還可以做一些事情,要獲得主機的批准:請他們更改您所有站點上的用戶,以便現在它在所有地方都是同一用戶。 然后應用案例1。請注意,這可能會影響其他因素,例如數據庫連接(如果通常不直接從PHP提供用戶身份)。 它不應該適用於您,很可能不適用於您,但是如果遇到一些麻煩,則可能是原因。

在某些系統上, foouser可能會允許baruser對某些功能進行“ sudo”操作。 這通常需要root(即您的主機的知識,批准和可能的工作),但是在某些設置中,您可以自己執行此操作。 屆時,您將能夠使用cat等命令運行腳本並將文件復制到標准輸出。 雖然可能,但它凌亂,性能不是很高。

一個折衷方案(仍然需要您的主機批准)是創建一個用戶組(miomirgroup),將一些用戶(exampleuser,foouser,baruser ...)放入該組,然后將組讀取權限授予您自己空間中的文件夾以進行分組miomirgroup 僅對於該文件夾,PHP的行為就像情況1一樣。

圖像將需要放置在公共文件夾中才能訪問。 您可以通過將圖像放置在公用文件夾中,或者通過將PHP腳本放置在公用文件夾中來檢索“隱藏”圖像並發送打開請求來做到這一點。

示例1-公用文件夾中的圖像

例如,假設“ / public”是我們的公共www文件夾,“ / private”是FTP服務器上的一個文件夾,無法從Web上訪問。

您可以訪問/ public文件夾:

/wwwsites/mysite/public/images/hello.png
Link to image: <img src="/images/hello.png">

由於Web服務器不允許訪問,因此您無法訪問私有文件夾。 /wwwsites/mysite/private/images/hello.png鏈接到圖像:(不可能)

示例2-使用PHP腳本http://php.net/manual/en/function.imagepng.php檢索“隱藏”圖像

$im = imagecreatefrompng("test.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);

在您要從中訪問圖像的服務器中創建文件img.php

<?php
//add all the image's names to this array for white listing
$images = Array( "1.png",
                "2.png");

if(isset($_GET['image']) AND !empty($_GET['image'])){
  $request = $_GET['image'];
if(in_array($request,$images)){
    header('Content-Type: image/png');
    include_once('/path/to/non-root/folder'.$request);
}
}

現在您可以使用some.thing / img.php?image = 1.png訪問文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM