您好,我对 C 语言很陌生,简而言之,我在课堂上做了以下作业:
foo (char *var) {
printf(var);
}
有人告诉我这是不好的做法并且不安全,但我的导师没有得到太多详细的信息。我假设如果 var 的字符串值可以由用户控制,它可以用来执行缓冲区溢出吗?我将如何正确强化此代码?我是否必须限制 str 长度或其他什么?
干杯和感谢!
这是不安全的,因为它可能导致格式字符串攻击
你应该使用:
printf("%s", var);
反而。按照你的方式,我可以输入%s
作为我的输入,并printf
在它寻找要打印的字符串时读取一段随机的内存。这可能会导致任何数量的意外行为。
嗯,printf的第一个参数是一个格式字符串。所以你的函数的调用者可以通过:
foo("%d")
然后printf
会寻找一个不存在的整数,并导致未定义的行为。一种可能的解决方法是让您的函数调用:
printf("%s", var);
这将printf
解释var
为常规字符串(而不是格式)。
Printf 具有以下签名:
int printf(
const char *format [,
argument]...
);
如果用户输入格式字符,例如 %s,就会发生各种不好的事情。
如果您只想输出字符串,请使用 puts。