2010-01-19 106 views
21

我正試圖幫助一個朋友從一個網絡酒店移動到另一個網站。 舊的地方已經關閉,我只有一個平坦的tar文件。PHP腳本/目錄有什麼權限?

該網站包含HTML文檔,可以下載一個小的Java應用程序(在手機上加載)發送數據到網站。

移動Java應用程序發送一個字符串到URL=<HOST>/php/register.php。這個php腳本包含另一個php腳本(../inc/db_login.php),它使用$link=mysql_connect()連接到SQL DB。另一個文件register.php執行了SQL插入操作,將新發送的數據放入數據庫中。

我的問題是基本的,我應該把這2個PHP文件放在新網站上,目錄和文件應該具有什麼權限?

舊的Web服務器顯然有一個/php/inc目錄。這些都不存在於新的網絡服務器上。我應該創建它們嗎?他們應該有什麼權限?我猜想在一個單獨的PHP文件中擁有密碼的原因是安全性。 /php/inc目錄可能具有不同的權限。

新服務器的目錄:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf(和其他一些人可能不相關)

我的問題

  1. 請問文件擴展名(.php)意味着什麼服務器:爲PHP腳本的HTML代碼「包含」(<?...?>之間,並在服務器需要看文件後綴或者是無關緊要的? (據我所知,在服務器上<?...?>反應,當然)

  2. 應的公共文件(register.php在我的情況)被放置在httpdocs/目錄或不服務器(Apache的我認爲)反應的東西和其取出在另一個目錄?

  3. PHP腳本是否有權限R-X(讀取和執行),--X(執行)或R--(讀取)?從操作系統的角度來看,我猜apache只是讀取這些文件,這意味着它們應該是R--,但這意味着如果PHP服務「停止」,客戶端將在瀏覽器中獲取所有PHP代碼(?)。我寧願它--X,但因爲這既不是一個二進制也沒有#!,我想它一定是--R

  4. 如果公共PHP腳本可以放在另一個目錄中(例如/php而不是/httpdocs),/php(和腳本)應該有什麼權限?我猜服務器必須知道這個/php目錄(或者是否有通常的默認值?)

  5. 包含PHP腳本(../inc/db_login.php,包含SQL密碼)不應該在/httpdocs下我猜。這意味着我的register.php包含一個不在/httpdocs子樹下的文件。這是否工作?服務器需要知道嗎?

我知道您可能需要了解服務器配置。在你的答案中假設默認值(如果是的話,你可以知道它在哪裏更改)。

回答

46

目錄必須具有執行權限才能使用。通常這是0755。通過mod_php運行的PHP腳本不會被執行,而是被讀取; 0644就足夠了。必須編寫的目錄需要由運行Web服務器的用戶擁有。可能還有一些關於權限的問題,例如, SELinux,但上面的內容會讓你瞭解基礎知識。

其他用戶或外部客戶端不能訪問的文檔應爲0600,由Web服務器用戶擁有,並位於DocumentRoot外部。請注意,在安全模式下運行mod_php會阻止腳本包含DocumentRoot之外的任何內容;一個可悲的缺陷。

+0

感謝您的回答。我會把register.php放在httpdocs/php中。 現在我試着創建/ inc幷包含../../inc/db_login.php,但是創建/ inc被拒絕了......應該將db_login.php放在cgi-bin中然後呢?如果apache處於安全模式,那麼db_login必須位於httpdocs樹中......這不是安全風險嗎? – 2010-01-19 20:44:34

+0

CGI腳本應該放在'cgi-bin'中。是的,在DocumentRoot下有配置文件是潛在的安全風險; PHP可以通過配置選項來解決這個問題,該選項指定了一個可以明確包含的額外目錄。但事實並非如此。 – 2010-01-19 20:48:54

+0

但是,如果register.php和db_login.php都在html文檔根目錄下並且它們的權限相同,那麼它們在2個不同文件中的增益(安全性)是什麼。我認爲這個想法是圍繞db_login中包含的密碼提供「更多的安全性」...?如果PHP失敗,代碼到達客戶端是不是有風險?再一次,很多人非常感謝你的時間。/C – 2010-01-19 21:26:22

1

我編寫一個函數來解決這兩個PHP/SuPHP和類似的權限問題:

function realChmod($path, $chmod = null) 
{ 
    if (file_exists($path) === true) 
    { 
     if (is_null($chmod) === true) 
     { 
      $chmod = (is_file($path) === true) ? 644 : 755; 

      if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true) 
      { 
       $chmod += 22; 
      } 
     } 

     return chmod($path, octdec(intval($chmod))); 
    } 

    return false; 
} 

也許這是對您有用。

+0

您應該考慮使用八進制文字而不是處理octdec()cruft,並使用'| ='而不是'+ ='。 – 2010-01-19 19:31:25

+1

您正在使用PHP腳本修復PHP腳本的權限?如果服務器的權限不足並且不允許PHP腳本運行,那麼這個腳本也不會運行。雖然如果您手動修復此腳本的權限,那麼您可以使用它來對其他人進行批量恢復。不過,從命令行使用'chmod -R'可能會更快。 – MidnightLightning 2010-01-19 19:34:29

+0

@MidnightLightning:即使它在Web服務器中無法正常工作,仍然可以通過CLI運行PHP腳本,假設您有shell訪問權限。另外,'chmod -R'可能很危險,最好使用恰當製作的'find'代替。 – 2010-01-19 20:51:55

1

1)以.php擴展名結尾的文件由Apache轉交給PHP編譯器。如果沒有設置正確的配置,PHP文件將作爲文本文件由服務器提供。 httpd.conf文件中的Apache配置行「AddHandler php5-script php」是設置它的PHP5方法。

2)register.php需要訪問http://www.example.com/php/register.php,因爲java應用程序正在尋找它,所以在Apache htdocs文件夾中,需要一個帶有register.php文件的「php」文件夾。

3)PHP文件需要運行Apache服務的用戶讀取訪問。使用PHP作爲Apache模塊沒有「服務」可以說PHP是獨立的。相反,Apache服務在獲取PHP文件的請求時,會對PHP二進制文件進行shell調用,以解析文件並將Apache服務交付給客戶端的結果。只有從命令行(CLI設置)使用PHP時,腳本才需要執行權限,並且從#!/path/to/php-bin行開始。

4)請求的文件(register.php)需要在htdocs中才能被Apache服務。如果PHP在禁用「安全模式」的情況下運行,register.php可能包含位於htdocs文件夾之外的文件。

5)的路徑「../inc/db_login.php」是相對於PHP腳本,原本牽強(register.php),所以,既然register.php是htdocs/php/register.php,這將使db_login.php在htdocs/inc/db_login.php

+0

第3點:CLI和CGI設置都需要執行權限。 – 2010-01-19 19:33:46

0

所有打算直接通過URL尋址的PHP文件都可以與靜態內容(這是通常的做法)愉快地駐留在相同的目錄中。

這是一個很好的做法,至少有一個目錄在web服務器以外的地方可以保存包含文件,但PHP包含路徑仍應包含'。'。

我建議你不把大量的非標準目錄的根文件系統 - 默認的根目錄的分佈有所不同,但我通常喜歡的東西去:

/無功/網絡/ htdocs目錄 - 作爲文檔根 /usr/local/php - 用於包含文件

顯然,如果您打算運行您的web服務器chrrot,則應該相應地映射它們。

所有的文件必須通過服務器在其下運行的UID可讀,但是如果你可以限制,那麼你關閉掉潛在的攻擊向量什麼是這個UID儘可能多地寫。

我通常會將我的dirs設置爲drwxrwSr-x,作爲webdev團隊的組所有者的webdev組成員擁有的drwxrwSr-x(httpd uid不在webdev組中),因此文件是-rw -rw-r--所以webdex組中的任何人都可以更改文件,並且httpd uid只能讀取文件。

1)完成了文件的擴展名(.php)意味着什麼服務器:

是 - 去閱讀PHP的安裝指南。

C.

9

設置PHP文件640

對於最大的安全性你應該設置最低權限,這是

  • 主人6將是一個上傳的文件。
  • 組4將是一個服務的文件。讓apache成爲組員。
  • nobody 0表示沒有其他用戶可以讀取此文件。這很重要,因爲php腳本有時會有密碼和其他敏感數據。

決不允許被任何人讀取PHP腳本。

有用的命令:

chmod 640 file.php 
chown user:group file.php 
usermod -a -G group apache 

了這些命令都在做:

  1. file.php變更所有權,以便用戶可以讀寫,組讀。
  2. 將file.php的所有權更改爲選定的用戶名和組名。
  3. 將apache添加到該組中,以便apache可以提供該文件。否則640將無法工作。