2012-10-24 17 views
0

我遇到了$ _POST和$ _GET的嚴重問題。我是新來的PHP。剛剛開始一週前。

我有一個調用PHP的動作的HTML表單。

<html><body> 
<form action="ls_sample1.php" method="post">Submission ID: <input type="text" name="sub_id" /> 
<input type="submit"/></form> 
</body></html> 

我有一個PHP它接受sub_id和exectute系統命令

<?php 
ini_set('display_errors',1); 
error_reporting(E_ALL); 
?> 

<?php 
$input = $_POST['sub_id']; 
echo "Entered submission id is $input"; 
system('/auto/ash/g2k/bin/gt -F stat -s $input',$ret); 
if($ret) { 
echo "its invalid input because return value is $ret"; 
} 
?> 

忽略在上述代碼的命令。它就像任何其他的Unix命令一樣。當我在shell中執行時,一切正常,返回值爲0.當我在瀏覽器中執行它時,返回值是1,並且沒有執行任何操作。但提交ID正在傳遞給PHP。

瀏覽器輸出: 進入提交id爲0000268801其無效的輸入,因爲返回值是1

我在這裏缺少什麼?請幫忙。

+1

退出時,我相信該命令會以不同的用戶身份執行:www-data通常。該用戶是否有權執行該命令? –

+0

您是否期望'$ input'在單引號字符串中被展開? – Musa

+2

單引號表示$輸入不會被'擴展'爲可變內容,使用雙打 – 2012-10-24 20:56:00

回答

4

所以...沒有。不要這樣做。

如果有人提交的形式,使得輸入字段包含此:

; rm -rf ~/ # 

然後你就有麻煩了。而且它們可能比刪除所有文件更惡意。

看看escapeshellarg

WRT您的錯誤:

返回代碼1通常表示一般(未指定的)錯誤。有時PHP會將某些內容轉儲到可能有用的錯誤日誌中。您可以檢查以確保您的apache用戶實際上擁有運行此程序的權限,並且您的php.ini文件中沒有任何內容會干擾。

在所有簡單的解決方案中失敗,我會做的是strace Apache實例,看看會發生什麼。這有點高級,但如果你知道如何使用這個工具,那麼它是非常不可或缺的。我會臨時更改apache配置,以便只有一個apache工作進程,使用strace連接到它並將輸出轉儲到文件。然後在文件中搜索可執行文件的名稱,然後從那裏執行執行鏈。最終你會遇到錯誤,看看它是什麼。您可能還要注意-s選項strace(控制它截斷字符串的位置),-w設置輸出文件,-t-tt其中添加了時間戳。

請不要問我解釋如何做所有的東西;它會佔用頁面。

+0

如果您將Web服務器的用戶權限設置爲可以工作,那將是第一個要修復的問題 – 2012-10-24 20:57:46

+0

@Dagon不要依賴權限來保存您的權限。 'rm -rf'只是一個例子,表明它很危險。更有可能的是下載和執行後門程序。而你的權限並不能幫你解決問題。 – tylerl

+0

仍應是第一個通話端口,從低到高的安全性。 – 2012-10-24 21:01:10