为什么在linux编程中使用system()是不好的?

可能重复:
在Linux下从C,C ++发出系统命令

我在一些文本上看到,在linux编程中使用system()方法并不好,我想知道它的真正原因是什么? 它应该消耗更多的内存,也许更多的CPU。 除了这些可能是什么原因呢?

例如,如果我inputsystem("echo 1 > file"); 而不是使用fopen(), fwrite()黑客可以在我的程序/ linux系统中做什么? 由于安全问题,我看到system()不是build议。 但是,一个人如何才能使用system()调用来攻击一个linux系统呢? 我会很高兴,如果有人可以明确地解释什么可以去使用system()。

使用system("echo 1 > file"); 从字面上来说不是一个安全风险,只是不必要的执行另一个你不需要的进程。

当你以编程的方式建立一个字符串,然后在system()使用它时,就会冒风险。 那么你有一个shell命令注入的风险,在那里你认为你正在构建一个命令,但是一个恶意用户通过给你精心设计的输入来颠覆你的程序,导致你的命令做你没有想到的事情。

问题在于你信任传递给系统的字符串是安全的。 假设你有这样的事情:

 char *command = null; //Read command from external source; system(command); 

你能信任命令是否安全,而不是做一些像“rm -fr〜/ *”这样的命令? 使用fopen并不能使你安全,虽然因为黑客也可以通过文件名/ etc / passwd来读取你不想要的东西。 你编程接口与外界的底线。 那就是你对外部用户可以做什么进行一些验证和限制的地方

系统(3)启动另一个进程并运行一个命令解释器(“/ bin / sh -c”)来执行你的命令。 如果您的程序使用SUID或SGID位运行,这可能是一个问题。 shell的行为受许多环境变量控制,其中一些可用于获取命令解释器的控制权。 这种情况与执行SUID或SGID shell脚本类似。