使用格式化字符串函数时,应该避免将用户输入的数据直接作为格式化字符串的一部分,因为用户可能通过输入恶意代码来利用此漏洞进行攻击。可以使用格式化字符串的安全版本,如snprintf()函数。另外,也可以在使用格式化字符串函数之前对用户输入的数据进行验证和过滤。以下是一个示例代码:
#include
int main() {
char user_input[50];
int count;
printf("请输入一个数字:\n");
scanf("%d", &count);
printf("请输入一个字符串:\n");
fgets(user_input, 50, stdin);
// 错误示范:
printf(user_input);
// 正确示范:
// printf("%s", user_input);
return 0;
}
在上述示例代码中,使用了不受控的格式化字符串函数printf()来向屏幕输出用户输入的字符串。如果用户输入的字符串中包含了格式化字符串的控制字符,那么就会导致不受控的格式化字符串漏洞。正确的做法是使用安全版本的printf()函数:printf("%s", user_input)。