簡體   English   中英

C++ 中是否有替代“system()”命令的方法。?

[英]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);

他們可以調用各種惡意命令。 另一個安全漏洞來自於某人可能用一些惡意代碼替換您系統上的clsclear命令。
克服這個問題的唯一方法是以某種方式保護您的系統,這是不可能的。

如果是這樣,是否有 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 的示例):

  • 狀態碼(shell 是否指示錯誤情況)
  • 標准輸出的內容
  • STDERR 的內容

system返回狀態碼。 對於ls這樣的命令,你有興趣接收 STDOUT,你也可以查看狀態碼。 這對於system是笨拙的。

Python subprocess模塊被社區普遍接受,作為管理這些問題的一種更簡單的方法。

如何管理控制台

如果您正在嘗試管理控制台顯示,您可能會對像ncurses這樣具有廣泛操作系統支持的庫感興趣。

如果清除屏幕是您唯一需要做的事情,那么將ncurses添加為依賴項可能會很嚴厲。 如果是這種情況,那么我認為像您一樣使用system()沒有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM