我真的新到PHP,但我不得不最近趕在PHP中的工作,我做了一件具有以下結構:如何拒絕使用敏感信息的PHP文件訪問文件夾?
public_html
|
|- html
|- css
|- js
|- root
根是包含所有的PHP處理文件夾。在JS文件中,我將數據發佈到一個PHP頁面,然後完成它的工作。它一切正常,但我不知道如何限制用戶訪問該「根」文件夾和PHP文件,因爲它包含我不想透露的信息。
我也試過.htacess
,但它給500內部服務器錯誤。
我真的新到PHP,但我不得不最近趕在PHP中的工作,我做了一件具有以下結構:如何拒絕使用敏感信息的PHP文件訪問文件夾?
public_html
|
|- html
|- css
|- js
|- root
根是包含所有的PHP處理文件夾。在JS文件中,我將數據發佈到一個PHP頁面,然後完成它的工作。它一切正常,但我不知道如何限制用戶訪問該「根」文件夾和PHP文件,因爲它包含我不想透露的信息。
我也試過.htacess
,但它給500內部服務器錯誤。
這就是我所做的。
移動的PHP文件出來公用文件夾的除了一個網關文件
scripts/
prepend.php
a.php
b.php
public_html/
gateway.php
html files
css files
js files
我用的.htaccess爲我的PHP腳本的所有請求重定向到gateway.php
。這個文件完成剩下的工作:獲得a.php
,瀏覽器需要請求url /php/a
。 /php/b
將被轉發到b.php
...
RewriteEngine On
RewriteBase/
RewriteRule ^php/(.*) gateway.php?file=$1.php [END,QSA,NC]
END
意味着停止尋找更多的重定向規則。 NC
表示不區分大小寫的匹配。 QSA
表示將查詢參數(如果有的話)附加到重定向目的地。
在php.ini
中,我設置auto_prepend_file
指向腳本文件夾中的文件。這個文件在所有的PHP腳本之前運行,所以我可以用它來做一些配置。部分它有一個允許的PHP腳本列表。
prepend.php
//the only scripts that will be allowed to run (besides gateway.php)
Const SAFE_SCRIPTS = '"/path/to/gateway.php","/path/to/a.php" ...';
Const SCRIPTS_PATH = __DIR__; //this file should be in the scripts directory
//block unnknown files. This will prevent a malicious file from running
$file = $_SERVER['SCRIPT_FILENAME'];//should be /path/to/gateway.php
if(strpos(SAFE_SCRIPTS,"\"$file\"")===false) {http_response_code(404);exit;}
gateway.php負責確保所請求的PHP文件是允許列表將請求轉發到正確的文件
//get the file requested. Comes from the htaccess rule
$file = SCRIPTS_PATH.'/'.$_GET['file'];
//if file is not in the allowed list, abort
if(strpos(SAFE_SCRIPTS,"\"$file\"")===false) {http_response_code(404);exit;}
//load the file that will handle the request
require SCRIPTS_PATH.'/'.$file;
的和
我的設置稍微複雜一點,但你明白了。將我的腳本保留在公共Web文件夾之外。
我不確定你想要準確隱藏的內容,但是人們無法直接通過Web服務器訪問您的PHP代碼,因爲代碼將始終運行,並且只有返回的數據可以被檢索。
但是,您可以使用來自Web根目錄之外的文件的包含內容,並使代碼在Web根目錄中返回所需的數據。
因此,惡意用戶無法訪問公用文件夾內的php文件?他們不能像www.website.com/root/config.php那樣做一些事情,並打開上述頁面? – Forget
@忘記他們可以,但他們只會看到php標籤('<?php'和'?>')之外的東西或者任何迴應給用戶的東西。只要你的配置頁面是php代碼,它就會看起來像一個空白頁面給他們。 –
爲什麼不移動'root' 1級上部?所以將與'public_html'處於同一級別。我認爲這種方式的文件將無法訪問(取決於你如何配置你的服務器) –
然後,他/她需要一種方法,使腳本可以訪問的Javascript發佈數據給他們 – BeetleJuice
JS無法以這種方式訪問文件, 它可以? – Forget