编写一个像printf这样的函数,可以在第一个参数之后清理所有参数,使其免于`%`符号

时间:2016-09-28 02:06:07

标签: c security printf variadic-functions

user_input = "%s%s%s%s%s%s%s%s";
printf("user input is: %s", user_input);

......崩溃!

以上行会导致错误。我想编写一个可以像printf一样使用的函数,但可以在第一个之后清理所有参数,以确保它们不包含%符号。该函数应该像'printf'一样使用,因为它可以使用任意数量的参数,并以相同的方式打印出一个字符串。如果其他参数包含%符号,我只想在将该符号放入格式字符串之前将其取出。

如果这个新函数被称为safe_printf,我希望行为如下:

user_input = "%s%s%s%s%s%s%s%s";
safe_printf("user input is: %s, user_input);

用户输入是:ssssssss

似乎写这样的函数可能是不可能的,(我无法弄清楚如何在不知道有多少的情况下预处理va_list中的char *)如果是这种情况请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

如果将用户提供的输入传递给printf(3)函数,则存在字符串格式设置漏洞。您可以通过不允许发生这种情况来阻止这种情况,永远。绝对没有理由拥有动态格式字符串,因为您应该提前知道所需的格式,因此您可以通过使用const char *

将格式字符串放入只读内存中