如何在C中使用系统命令之前清理输入

时间:2013-05-15 19:26:07

标签: c security system printf

这是我在C:

中的代码
snprintf(buffer, 1023, "ls -%s", argv[1]);
system(buffer);

如何清理缓冲区,以便除了给出的内容之外,没有人可以运行恶意命令?

2 个答案:

答案 0 :(得分:0)

不幸的是,这是一个非常大的话题,不能在SO问题中涵盖。幸运的是有a phenomenal book out there about Secure Coding in C and C++。那本书被用作我公司安全编码课的“教科书”,非常好。

有许多不同的方法来消毒输入,最好的方法几乎完全取决于输入的来源以及如何使用。如果你将它传递给system(),你需要深入研究,你应该让安全工程师检查你的设计。原因是ls二进制文件中可能存在可利用的漏洞,只能使用标准字符触发,或者可能存在您不知道的缓冲区溢出漏洞等。

专门针对您的方案,只查找最简单的攻击,如果您递归删除所有; && || $ { {1}} (,你击败了我能轻易想到的大部分攻击。请注意,虽然为了防止利用您将输入传递给的二进制文件作为arg(在本例中为)),但它只能防止具有特殊含义的常见shell字符,并允许执行任意命令。

答案 1 :(得分:0)

在一般情况下,这是不可能的。 C标准没有对谁解释通过system的命令提出任何要求。例如,如果为承载的shell编写转义函数,则在Windows系统或使用不同命令shell的系统上可能完全没用。