2013-04-22 44 views
0

在PHP我做了以下內容:用戶WWW的數據不能刪除文件

exec('remove_file.sh', $output, $return); 

其中remove_file.sh是下面的腳本:

#!/bin/sh 
rm -f /tmp/test.pdf 

我證實,此腳本由WWW-運行data和test.pdf由myuser擁有,但擁有666(rw-rw-rw-)權限。/tmp由root擁有並擁有666權限。

該腳本返回1(一般錯誤),沒有任何輸出。

如果我從終端嘗試:

sudo su www-data -c 'rm -f /tmp/test.pdf' 

我得到:

cannot remove `/tmp/test.pdf': Operation not permitted 

如何從一個PHP腳本刪除此文件?

+0

'ls -al/tmp/test.pdf'的輸出是什麼? – fyr 2013-04-22 08:54:37

+0

你嘗試過設置執行位嗎? chmod 777給rwxrwxrwx?目錄的權限是什麼? HTTP://unix.stackexchange。com/questions/21251/why-do-directories-need-the-executable-x-permission-to-be-opened – Waygood 2013-04-22 09:00:36

+0

$ fyr即:-rw-rw-rw- 1 myuser myuser – tihe 2013-04-22 09:03:24

回答

2

您可能必須確保www-user對目錄以及文件具有寫入權限。這取決於文件系統,但大多數需要此操作用於rmmv操作。

所以chmod 777 /tmp應該做的伎倆。

編輯:上述可能不是一個安全的方式來實現所需的可用性。根據您的設置,更徹底的方法是將www-user添加到users組(假設myuser主組爲users),然後將/tmp目錄設置爲用戶&組的rwx組。

# usermod -g users www-user 
# chmod 770 /tmp 

能讓每個人都讀,寫和/tmp執行不適合多用戶或不安全盒,雖然它可以良好保護的服務器上工作得很好,你給了很多訪問的人誰妥協箱子。

一個更好的選擇是讓php上傳文件到更本地的目錄,而不是使用$_FILES使用bash腳本,然後再次使用PHP刪除它們unlink。這樣所有文件將屬於www-user。請記住,在允許上傳以通過c99 and similar malware防止攻擊之前,徹底驗證文件是非常重要的。

EDIT(從OP):

雖然安全問題不案件,不適用,我完全與前編輯同意。使用/ tmp是懶惰的出路。但真正的問題是,我測試了在我自己的用戶下創建一個文件,然後從www數據繼續測試。在/ tmp的默認權限下,你不能(正確地)刪除另一個用戶文件或覆蓋它。這導致了各種問題,不僅與公司有關。

+0

chmod 666實際上破壞了我係統上的某些會話功能(我不明白,因爲我認爲權限已經是666),但是777解決了包括rm在內的所有問題。如果你願意,編輯你的答案,以便我可以接受它。 – tihe 2013-04-22 09:19:28

+0

@zensys - 它可能需要722(爲所有者執行 - 只爲其他人編寫),但已編輯爲777,因爲它適用於您。 – 2013-04-22 09:20:46

+0

更好的'chmod 1777/tmp',這樣只有文件的所有者才能刪除或重命名它。 '1'是[sticky bit](http://en.wikipedia.org/wiki/Sticky_bit) – fedorqui 2013-04-22 09:32:46