[英]PHP session files permission
我想使用session_id($id)
用現有的會話替換會話。 我/tmp/php_sess
目錄移動到/tmp/php_sess
,並為該文件夾設置了 777 權限。
但是 PHP 在該文件夾中創建了具有權限的會話文件:
-rw-------
另一個腳本(來自 CLI)無法讀取它。 如何告訴 PHP 為所有人創建具有權限的文件 ( 777 )?
我認為這是XY 問題的一個實例。 我將嘗試解決核心問題和您嘗試的解決方案。
更改會話文件的權限。
在更改會話文件的模式之前要三思而后行,注意相關的安全隱患。 但既然你問了,讓我們假設你知道你在做什么。
您有三個選擇:
創建后chmod會話文件
session_start(); $path = session_save_path() . '/sess_' . session_id(); chmod($path, 0640);
這就是您在回答中所做的。 一個嚴重的問題是您必須在對session_start()
任何調用之后添加chmod
調用,即使它是在 PEAR 模塊或任何其他第三方代碼中完成的。 這是一個維護噩夢。
在session.save_path
設置模式
最好在php.ini
或.htaccess
(通過php_value session.save_path …
),但如果您無權訪問其中任何一個,則可以直接從 PHP 中使用ini_set()
,在腳本開頭附近的某個位置:
ini_set('session.save_path', '0;640;' . session_save_path());
從這三個中,我會選擇這個,因為它很好地平衡了復雜性和清潔度。
實現您自己的會話存儲
您可以隨心所欲地實施會話。 在您的代碼中,您可以確保您創建的文件具有正確的權限。
想象一下這里有很多代碼。 即實現SessionHandlerInterface
的類和對腳本開頭附近某個地方的set_session_save_handler
的調用。
模式 640 的選擇假定創建會話的腳本和 CLI 腳本由同一組中的用戶運行,並且 CLI 腳本只需要讀取訪問權限。 如果不是這種情況,請使用644(都可以讀取)、660(組可以讀寫,其他人什么都不能)或666(都可以讀寫)。 遵循最小特權原則。 請注意,進程的umask可能會阻礙您的努力——您可以先更改它,例如通過umask(0022)
。
使 CLI 腳本工作。
如果您在擁有會話文件的同一用戶下運行 CLI 腳本,則無需更改其模式。 模式 600 確保會話文件的內容安全。
如果您需要能夠從另一個用戶的帳戶執行腳本,您可能需要setuid或sudo ,但確保不要創建與使用高於 600 模式時相同的安全漏洞。
當 CLI 腳本確實需要在與創建會話的用戶不同的用戶下運行時,嘗試的解決方案(更改會話文件的模式)實際上可能是正確的做法。 我知道一個網站的腳本由多個用戶編輯,所有用戶都在同一個組中。 每個 PHP 腳本都通過suphp
在其所有者下執行。 如果一個腳本創建了一個會話文件,則其他用戶創建(並因此擁有)的腳本不能使用它。 使會話工作所需的權限是 660,它仍然是一個相當安全的設置。 保留 600 模式並在專用的人工用戶下運行服務器和所有腳本會更好,仍然。
此答案的早期版本比較了解決方案並詳細提到了它們的優缺點。 它還討論了適當模式的選擇。 它的冗長讓我有一種想把它清理干凈並只留下最重要的部分的沖動。 不過,您可能仍然會發現它很有用。
我找到了一些解決方案。 PHP 創建會話時,可以設置文件權限。
session_start();
$path = session_save_path().'/sess_'.session_id();
chmod($path, 0777);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.