2009-06-11 12 views
14

我正在編寫我們公司使用的一個可怕的通信軟件的web界面。該軟件沒有真正的用戶界面,並要求我們給我們的系統提供膩子訪問,以便我們的客戶甚至可以提取數據。我的網絡界面必須運行一個exec();函數,它必須傳遞用戶輸入的一些變量。使用用戶插入變量來清理exec命令的最佳方法

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; 
$last_line = exec($command, $output, $returnvalue); 

現在,我想我也許可以剛剛從$command varible刪除任何分號和是安全的,但我不知道,這就是爲什麼我們去住下個月之前我在這裏冒充本。

什麼是最好的消毒方法$command?有幾個特殊的字符,我需要在變量[ ] < > ! # $

回答

17

請使用PHP爲此具有的功能:

$cmd = 
    "/usr/bin/do-something " . 
    escapeshellarg($arg1) . 
    ' ' . 
    escapeshellarg($arg2); 

您還可以使用escapeshellcmd()

有什麼區別?

escapeshellarg()僅在字符串周圍添加字符,然後在任何其他字符前添加字符。 http://www.php.net/escapeshellarg

escapeshellcmd()轉義所有shell敏感字符($,\等等),但不加引號。 http://www.php.net/manual/en/function.escapeshellcmd.php

該問題是在您使用escapeshellarg()作爲引用的一部分的情況下。然後它變得毫無用處(實際上將引號添加到混音中)。

一般來說,我們傾向於使用escapeshellcmd()加上我們自己的引號。

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'"; 

請安全!

+3

刪除我的答案,因爲顯然我們在同一時間打字,但你給了體面的例子。鏈接手冊:http://us.php.net/manual/en/function.escapeshellarg.php,http://us.php.net/manual/en/function.escapeshellcmd.php – 2009-06-11 19:06:29

相關問題