这是我在C:
中的代码snprintf(buffer, 1023, "ls -%s", argv[1]);
system(buffer);
如何清理缓冲区,以便除了给出的内容之外,没有人可以运行恶意命令?
答案 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的系统上可能完全没用。