2013-05-29 16 views
1

我有一個簡單的C++應用程序,用於在另一個用戶的特定目錄中執行perl腳本。從用戶提供的路徑中刪除前導「../」

wrapper my-perl-script.pl 

我想確保用戶不會試圖欺騙C++應用程序到由前綴的具體目錄以外執行腳本「../」。什麼是最好/最簡單的方法來做到這一點?

這裏是我的包裝源的精簡版本。

int main (int argc, char *argv[]) 
{ 

    /* set user here */ 

    stringstream userCmd; 

    userCmd << "/path/to/scripts/"; 

    for (int i = 1; i < argc; i++) { 

     if (i == 1) { 
     // remove instances of ../ from the first argument 

     userCmd << argv[i] 
     } 
     else { 
     // add user supplied arguments for perl script to command 
     userCmd << " " << argv[i]; 
     } 

    } 

    /* use system to execute the user command */ 


    return 0; 
} 
+0

如果他們建立鏈接呢? –

+1

如果他們預先設置了一個相對目錄呢?如果他們要求運行一個符號鏈接到任何他們喜歡的文件,該怎麼辦?如果他們寫的perl腳本熄滅並做它喜歡的事情呢?有可能你在這裏問錯了問題,所以你可以提供關於具體細節的任何澄清都會很好。 –

+1

@MarkB但如果查克諾里斯突然決定通過徹底摧毀應用程序來欺騙應用程序呢? –

回答

1

我更喜歡處理字符串,而不是原始指針/數組:

int (int argc, char *argv[]) { 

    std::string path (argv[1]); 

    if (path.find("..") == std::string::npos) 
    { 
     //everything's fine 
    } 
    else 
     std::cout << "No execution in parent directories allowed."; 
} 

你之所以只是不切「」是,如果用戶輸入類似的路徑將不再正確「../bad/evenworse/script.sh」

1

在Linux下,功能realpath()會給你所請求的文件,你可以比較反對的路徑,你希望他們能夠從進入基本目錄的絕對路徑。在這裏看到:realpath manpage

如果使用者提供/path/to/scripts/../../../root/sensitive.shrealpath()會變成/root/sensitive.sh,你可以比較反對允許的目錄,並拋出一個錯誤給用戶。

0

答案是不要刪除相對路徑。如果用戶試圖傳遞相對路徑或完整的系統路徑,那麼他們是惡意的 - 只是終止應用程序。

int main (int argc, char *argv[]) 
{ 

    if (argc == 1 || argv[1][0] == '.' || argv[1][0] == '/') { 
    return 0; 
    } 

    ... 

感謝Johnathon Leffler對此解決方案的評論。

+0

'dir /../../../../ dangerzone /'怎麼辦? –

+0

良好的通話。在我的方案{dir}中,{/ path/to/scripts/dir}不存在。我在{path/to/scripts}下沒有子目錄 - 所以文件系統應該在你給出的場景中給出一個錯誤。你是對的,但有更安全的解決方案。懷疑茱爾還發布了一個答案,使用字符串搜索「..」 –