2012-03-03 184 views
0
執行PHP會議

我問這個問題here之前,但用戶CheekySoft指出,我在「問如何實現我提出的解決方案」裏,而不是我只是應「說明我的問題,並要求解決思路」 。所以在這裏。需要幫助suPHP

在Linux服務器我已經建立了像這樣

/home 
├── user1 
│   ├── [-rwx------] index.html 
│   └── [-rwx------] index.php 
└── user2 
    ├── [-rwx------] index.html 
    └── [-rwx------] index.php 

的文件如果我在

<Directory /home/user1>` 
<Directory /home/user2> 

設置Apache虛擬主機那麼[任何]用戶可以去www.example.com/user1/index.htmlwww.example.com/user2/index.html 。但是,這些文件的權限是0700,因此,它們無法通過網絡訪問。正因爲如此,我使用suPHP。

爲了討論的方便,可以說index.php只有在它

的index.php如下:現在

<?php 
echo file_get_contents('index.html'); 
exit(); 
?> 

,與suPHP成立,USER1可以去www.example.com/user1/index.php查看index.html。同樣,user2可以去www.example.com/user2/index.php查看index.html。但是,用戶1可以也可以轉到www.example.com/user2/index.php查看用戶2的index.html頁面,反之亦然user2。

處理這個問題的自然方法是通過PHP sessions。所有對頁面的請求都被重定向到主頁面(即www.facebook.com),用戶將根據數據庫進行驗證,然後重定向到正確的頁面(請參見下圖)。

User Interaction diagram

的用戶會去一個頁面(即www.example.com/page1.html),然後會有頁面1 硬編碼的一部分,以確保有效的會話存在。如果存在,則加載頁面。如果它不存在,用戶將被重定向到,在這種情況下,index.html。在他們登錄並建立有效會話後,它們將被重定向回原始頁面。我們可以修改index.php開展了這一點:

indexValidate.php:

<?php 
//this is purely pseudo code, I can't guarantee it will work 
session_start(); 
require_once 'Session_Validator.php'; 
$sv = new Session_Validator(); 
$sv->validate($un, $pwd); 

echo file_get_contents('index.html'); 
exit(); 
?> 

然而,在我的設計,這些頁面(page1.htmlpage2.html ...)是在用戶自己的目錄(index.htmlindex.php),因此,服務器不能要求他們有這個硬編碼部分檢查有效的部分。用戶可以簡單地編輯該文件以刪除此部分。當然,這對用戶來說是愚蠢的,但我不希望用戶必須修改他們的每一個文件來在頂部有一個會話檢查部分。我希望這是無縫的。

的幾個注意事項:

  1. 我可以使用Apache來所有請求重定向到一個單一的validateUser.php腳本,驗證用戶,然後,如果有效,調用請求的原始腳本。但是,這有一個suPHP現在已經切換到用戶的副作用,最有可能的var-www
  2. 我不想使用Apache web login authentication

任何人都可以提供一個解決我的問題?

+0

我相當有信心我的問題沒有解決方案http://stackoverflow.com/a/9561335/654789 – puk 2012-03-06 04:39:42

回答

1

如何爲所有用戶創建一個apache重寫規則,爲所有

HTML頁面創建一個單一 PHP包裝

的重寫規則可能是這樣的:

RewriteCond %{REQUEST_URI} !^/auth 
RewriteRule ^(.*) /auth/wrapper.php?uri=$1 

而且在wrapper.php

  1. 檢查用戶是否有效。如果不是,重定向到/auth/validate.php?redirect=<where-I-came-from>
  2. 如果驗證,加載uri=<...>

    echo file_get_contents('<...>');

編輯提到的文件: 您可以創建符號鏈接到wrapper.php,然後設置權限用戶的符號鏈接。你可以在身份驗證文件夾中做到這一點:

ln -s wrapper.php username1.php 
chown -h username1:username1 username1.php 

然後你就西港島線得到這樣一個文件夾:

-r--r--r--. 1 var-www var-www 15 march 3 12:45 wrapper.php 
lrwxrwxrwx. 1 username1 username1 17 march 3 12:47 username1.php -> wrapper.php 
lrwxrwxrwx. 1 username2 username2 17 march 3 12:52 username2.php -> wrapper.php 
lrwxrwxrwx. 1 username3 username3 17 march 3 12:52 username3.php -> wrapper.php 

請注意:用戶必須能夠讀取AUTH目錄 爲了使它更更安全的是你可以將wrapper.php放在一個單獨的目錄中。

+0

我曾嘗試過。問題是誰擁有'wrapper.php'?如果所有者是apache,那麼運行'wrapper.php'作爲用戶apache(我認爲它是'www-data'),*我認爲*當該腳本嘗試訪問時,例如'/ home/user1/index。該文件具有權限'0700'和不同的所有者,所以它不能執行它(由於相同的原因,不能讀取'/ home/user1/index.html')。 – puk 2012-03-03 02:05:47

+0

現在我可以爲用戶擁有的每個用戶創建一個包裝類,所以當用戶調用時,suPHP以**該用戶的身份運行腳本**。但是,那麼如何限制用戶修改該文件(畢竟它非常敏感)呢?我可以以某種方式將所有這些'用戶'文件放在一個單獨的目錄中,用戶無法訪問,但Apache可以嗎?你可能會找到一些東西。文件是否可以由父目錄所有者以外的用戶擁有(不包括粘性目錄)? – puk 2012-03-03 02:11:48

+0

但是suPHP會使用符號鏈接的所有者還是實際的文件?我使用類似於:'/ etc/validator(var-www 0700)','/ etc/validator/user1(var-www 0700)'和'/etc/validator/user1/validate.php(user1 0700)' 。通過這種方式,文件屬於user1,但由於user1無法訪問'validator /'或'user /',那麼他們無法編輯該文件=) – puk 2012-03-04 11:20:24