为什么我们不能在printf语句中传递程序的输入?

可能存在哪些安全漏洞? 还是任何攻击?

printf函数的哪个参数?

printf("%s\n", untrusted_string); 虽然如果输出到终端,并且如果终端响应控制代码,那么它可能会使终端设置陷入所有识别之外。

显然,当程序的输出将用作可执行代码时,它也会变得有趣。 它可能并不总是很明显。 例如,假设您编写了一个扫描Web服务器日志的程序,并生成一个列出所有访问过的URL的HTML报告。 进一步假设我访问http://example/ 。 我收到一条错误消息,但仍然记录了该URL。 如果您在未经修改的情况下打印输入,那么当您查看报告文件时,您可能会参加教育晚会。 用户输入需要在沿线的某处清理。

回应用户提供的数据,回到同一用户,有点安全。 然而,再次在Web环境中,XSRF攻击是一种常见的技术 – 您可能认为您的用户自己编写了输入,而实际上他们没有,所以实际上您将一些攻击者的数据回应给用户。 即使在命令行程序中也是如此 – 如果用户提供文件作为命令行参数,但是文件(如我上面的服务器日志)是由攻击者编写的,然后将该文件的一部分打印回用户可能会产生用户从未想过的后果。

这些都不是不这样做的理由。 与安全性一样,您无法确定特定操作“是”还是“不安全”,因为它取决于该操作发生的上下文。

printf(untrusted_string); 绝对不好,因为提供的字符串可能是“%s”,具有未定义的行为。 你可能会想到自己,“哦,好吧,它只能读到不应该的地方,可能造成的伤害是什么?” 在这种情况下,你最终会加入一长串人物,他们对于攻击者在组合多个错误以创建可行的攻击时表现出的聪明才智感到惊讶。 阅读你不应该明确可以导致DoS,但也结合其他问题可能泄漏敏感信息。

缓冲区溢出攻击。 见http://en.wikipedia.org/wiki/Buffer_overflow