[英]Is there an alternative to the 'system()' command in C++.?
我已經閱讀了很多答案,說system()
命令不好。 首先,為什么會如此糟糕? 其次,有沒有不會產生這種安全漏洞的替代方案? 我最想知道是否有辦法在 C++ 中清除屏幕。 在 python 中,我有一個 clear 函數來檢查操作系統名稱並運行system('cls')
或system('clear')
。 這也是一個安全漏洞嗎? 如果是這樣,是否有 python 替代方案?
首先,為什么會如此糟糕?
因為您在代碼中引入了對操作系統的依賴關系,並使其不可移植。
其次,有沒有不會產生這種安全漏洞的替代方案?
不,現有的替代方案(POSIX 兼容) fork()
和execxx()
或pipe()
具有引入操作系統依賴項和安全漏洞的相同問題。
這也是一個安全漏洞嗎?
主要安全漏洞是通過由參數構造的命令引入的,例如
void exec_ls(const std::string param) {
std::string cmd;
cmd = "ls -l " + param;
system(cmd.c_str());
如果有人設法通過param
注入一些額外的命令,例如
std::string param = "dir ; rm -rf /*";
// ^^^^^^^^^^^
exec_ls(param);
他們可以調用各種惡意命令。 另一個安全漏洞來自於某人可能用一些惡意代碼替換您系統上的cls
或clear
命令。
克服這個問題的唯一方法是以某種方式保護您的系統,這是不可能的。
如果是這樣,是否有 python 替代方案?
使用不同的編程語言作為中間調用者並不能解決我上面提到的問題。
system
函數(跨多種語言,包括 Python 和 C++)本質上並不是“壞的”,但它們在正確使用方面存在困難。
您需要絕對確保通過system
執行的任何操作都是安全的。
如果您編寫system("echo hello " + name)
那么您需要絕對確保該name
不會被惡意用戶控制。 name = "; rm -rf /"
將導致echo hello ; rm -rf /
echo hello ; rm -rf /
,所以如果它來自用戶,通過網絡表單或數據庫之類的東西,那么你需要非常小心,我會推薦一個比system
更復雜的解決方案。
像system("clear")
這樣的調用對您來說是安全的。
系統調用為您提供了幾個輸出(我將舉一個調用bash
shell 的示例):
system
返回狀態碼。 對於ls
這樣的命令,你有興趣接收 STDOUT,你也可以查看狀態碼。 這對於system
是笨拙的。
Python subprocess
模塊被社區普遍接受,作為管理這些問題的一種更簡單的方法。
如果您正在嘗試管理控制台顯示,您可能會對像ncurses
這樣具有廣泛操作系統支持的庫感興趣。
如果清除屏幕是您唯一需要做的事情,那么將ncurses
添加為依賴項可能會很嚴厲。 如果是這種情況,那么我認為像您一樣使用system()
沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.