簡體   English   中英

PHP 會話文件權限

[英]PHP session files permission

我想使用session_id($id)用現有的會話替換會話。 /tmp/php_sess目錄移動到/tmp/php_sess ,並為該文件夾設置了 777 權限。

但是 PHP 在該文件夾中創建了具有權限的會話文件:

-rw-------

另一個腳本(來自 CLI)無法讀取它。 如何告訴 PHP 為所有人創建具有權限的文件 ( 777 )?

我認為這是XY 問題的一個實例。 我將嘗試解決核心問題和您嘗試的解決方案。

嘗試的解決方案 (Y)

更改會話文件的權限。

在更改會話文件的模式之前要三思而后行,注意相關的安全隱患。 但既然你問了,讓我們假設你知道你在做什么。

您有三個選擇:

  1. 創建后chmod會話文件

    session_start(); $path = session_save_path() . '/sess_' . session_id(); chmod($path, 0640);

    這就是您在回答中所做 一個嚴重的問題是您必須在對session_start()任何調用之后添加chmod調用,即使它是在 PEAR 模塊或任何其他第三方代碼中完成的。 這是一個維護噩夢。

  2. session.save_path設置模式
    最好在php.ini.htaccess (通過php_value session.save_path … ),但如果您無權訪問其中任何一個,則可以直接從 PHP 中使用ini_set() ,在腳本開頭附近的某個位置:

     ini_set('session.save_path', '0;640;' . session_save_path());

    從這三個中,我會選擇這個,因為它很好地平衡了復雜性和清潔度

  3. 實現您自己的會話存儲
    您可以隨心所欲地實施會話。 在您的代碼中,您可以確保您創建的文件具有正確的權限。
    想象一下這里有很多代碼。 即實現SessionHandlerInterface的類和對腳本開頭附近某個地方的set_session_save_handler的調用。

模式 640 的選擇假定創建會話的腳本和 CLI 腳本由同一組中的用戶運行,並且 CLI 腳本只需要讀取訪問權限。 如果不是這種情況,請使用644(都可以讀取)、660(組可以讀寫,其他人什么都不能)或666(都可以讀寫)。 遵循最小特權原則 請注意,進程的umask可能會阻礙您的努力——您可以先更改它,例如通過umask(0022)

實際問題(X)

使 CLI 腳本工作。

如果您在擁有會話文件的同一用戶下運行 CLI 腳本,則無需更改其模式。 模式 600 確保會話文件的內容安全。

如果您需要能夠從另一個用戶的帳戶執行腳本,您可能需要setuidsudo ,但確保不要創建與使用高於 600 模式時相同的安全漏洞。

當 CLI 腳本確實需要在與創建會話的用戶不同的用戶下運行時,嘗試的解決方案(更改會話文件的模式)實際上可能是正確的做法。 我知道一個網站的腳本由多個用戶編輯,所有用戶都在同一個組中。 每個 PHP 腳本都通過suphp在其所有者下執行。 如果一個腳本創建了一個會話文件,則其他用戶創建(並因此擁有)的腳本不能使用它。 使會話工作所需的權限是 660,它仍然是一個相當安全的設置。 保留 600 模式並在專用的人工用戶下運行服務器和所有腳本會更好,仍然。


此答案的早期版本比較了解決方案並詳細提到了它們的優缺點。 它還討論了適當模式的選擇。 它的冗長讓我有一種想把它清理干凈並只留下最重要的部分的沖動。 不過,您可能仍然會發現它很有用。

我找到了一些解決方案。 PHP 創建會話時,可以設置文件權限。

session_start();
$path = session_save_path().'/sess_'.session_id();
chmod($path, 0777);

您可以設置incron來監視目錄並在創建文件時將其 chmod 為 777。不漂亮,但有效。 配置看起來像:

/tmp/php_sess IN_CREATE chmod 777 $@/$#

這必須在 root incron 配置中,以便使用 root 權限執行命令。 此處提供有關配置選項的更多信息。

暫無
暫無

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

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