📜  C C++中的system()令人惊讶的东西(1)

📅  最后修改于: 2023-12-03 15:29:41.611000             🧑  作者: Mango

C/C++中的system()令人惊讶的东西

什么是system()函数?

system()是C/C++中用于执行命令的一个函数。在程序运行时,可以使用system()函数来启动一个新的进程,并在该进程中运行特定的系统命令。在大多数操作系统中,可以使用以下Linux/Unix命令语法来启动一个新的进程:

system("command");

其中,command是要在新的进程中执行的命令。当该命令完成后,system()函数将返回该命令的退出状态。如果返回0,则表示命令成功执行。

system()的优缺点
  • 优点:system()函数简单易用,可以调用系统提供的强大功能,支持各种系统命令。
  • 缺点:system()函数调用系统命令会产生新的进程,会占用大量系统资源,同时也会导致一定的安全隐患。因此,如果一定要使用system()函数,必须谨慎使用,避免引发安全问题。
Examples
Windows下的示例:
#include <iostream>
using namespace std;

int main()
{
    int result;

    result = system("ipconfig");
    cout << "The command returned " << result << endl;

    return 0;
}

输出:

Windows IP Configuration

Ethernet adapter Ethernet:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Ethernet adapter VirtualBox Host-Only Network:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::adb8:9aff:fef7:ef09%14
   IPv4 Address. . . . . . . . . . . : 192.168.56.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter VirtualBox Host-Only Network #2:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::59f8:608:2a7d:2870%19
   IPv4 Address. . . . . . . . . . . : 192.168.100.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter VirtualBox Host-Only Network #3:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::68da:2bf0:30af:6b2a%25
   IPv4 Address. . . . . . . . . . . : 192.168.99.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

The command returned 0
Linux下的示例:
#include <iostream>
using namespace std;

int main()
{
    int result;

    result = system("ls -al");
    cout << "The command returned " << result << endl;

    return 0;
}

输出:

total 28
drwxr-xr-x 1 root root 4096 Oct 28 16:20 .
drwxr-xr-x 1 root root 4096 Oct  8 20:22 ..
-rwxr-xr-x 1 root root 8864 Oct 28 16:20 hello
-rw-r--r-- 1 root root  478 Oct 28 16:19 hello.c
drwx------ 2 root root 4096 Oct 28  2019 .ssh
防止系统命令注入攻击

由于system()函数的缺陷,因此在使用它时,必须采取一些措施来防止系统命令注入攻击。以下是一些防范措施:

  • 避免从用户输入中获取参数,尤其是用户输入的数据可能包含恶意内容的情况下。
  • 在调用system()函数之前,在程序中设置执行命令的路径,以确保安全执行命令。
  • 在处理敏感数据时,可以使用更安全的替代方案,例如exec()和fork()函数。