2013-04-18 51 views
0

這裏的externam節目是我的問題: 我想一些十六進制數據從PHP傳遞給外部應用程序:通行證hexdata從PHP

exec('echo "'.$message.'" | /usr/bin/gateway'); 

和$消息來自用戶輸入:

測試「 」/ '\'/「 \ 」「 //

和addslashes(),stripslashes()函數沒有解決我的煩惱。 在使用:

$message = stripslashes($_POST['message']); 

它的控制檯日誌中我可以看到:

sh: 1: Syntax error: Unterminated quoted string 

或空值

於是我開始思考,即轉換輸入十六進制值,並通過他們可能幫助:

exec('echo -e '.$message.' | /usr/bin/gateway'); 

但後來我得到了麻煩通過十六進制這個回聲的數據。

所以我的問題是如何做到這一點? 我需要傳遞完全相同的字符串,即用戶寫入網關服務。 - 用戶輸入轉換爲十六進制形式,並把它回聲-e (如何?) - 或以某種方式與報價打,斜線

+0

請告訴我,在直接輸出到'exec'調用之前,您正在清理'$ message'變量。另外,如何測試'「/'\'/」\「」//十六進制數據? –

回答

0

在一般情況下,你無法通過shell,因爲通過用戶輸入殼的逃脫規則。你應該做的是對新產生的進程的標準輸入流進行處理並直接提供它。

您可以使用popen做到這一點:

$handle = popen('/usr/bin/gateway', 'w'); 
fwrite($handle, $_POST['message']); 
pclose($handle); 

如果你需要做的比例節目和popen更不能提供足夠的功能,proc_open是一個更復雜和強大的替代方案。

警告:將未經過濾的用戶輸入饋送到外部進程會使您容易受到與進程如何解釋和執行此輸入有關的漏洞攻擊。如果您的應用程序可供不受信任的用戶訪問,請強烈考慮將輸入列入白名單!

+0

它工作得很好!非常感謝您的回答! :-) – Tom

+0

@Tom:很高興能夠提供幫助,儘管我不知道它是如何工作的 - 我只是修復了一個非常重要的錯字(有''''而不是''w'')。 – Jon

+0

我注意到其中一個也是'of'ofc',它沒有按預期工作,但最主要的是 - 使用popen而不是exec來修復我的頭痛:-) – Tom