我想使用org.apache.commons.exec
Java庫來調用可執行文件。 CommandLine
對象是否可以防止命令行注入?例如,如果我稱之爲:apache commons CommandLine對象可以防止命令行注入嗎?
String singleStringArgument = "-whatever;rm -rf ~/*"; // evil looking argument!
CommandLine cl = new CommandLine(new File(pathToExe,exeName));
cl.addArgument(singleStringArgument); // oh no!
Executor exe = new DefaultExecutor();
exe.execute(cl);
將rm -rf ~/*
也除了本來的命令運行?如果確實如此,防止這種情況的最佳方法是什麼?
該API說addArgument()
「處理引用」,但我不確定這意味着在這種情況下。我可以掀起一個測試案例來看看我的Linux機器上發生了什麼,但我想確保它在其他平臺上也是安全的。
我不打算直接運行'sh -c',但是我擔心apache commons的內部可能會在某些情況下通過系統shell進行調用 - 或者它們會以某種方式繞過shell嗎?在C中,我知道用用戶提供的普通輸入調用'system()'是不安全的,因爲'system()'用給定的參數調用'/ bin/sh -c'。 – 2011-06-14 00:55:13
如果文檔沒有明確描述行爲,你可以看看源代碼 - 但是你會依賴於實現而不是規範。 – jdigital 2011-06-14 01:15:19