你好,我对C很陌生,简而言之,我作为课堂作业的一部分做了以下工作:
foo (char *var) {
printf(var);
}
有人告诉我,这是不好的做法和不安全因素,但我的导师没有得到很多关于此的详细信息。我假设如果var的字符串值可由用户控制,它可能用于执行缓冲区溢出?我如何正确强化此代码?我是否必须限制str长度?
干杯&谢谢!
答案 0 :(得分:6)
您应该使用:
printf("%s", var);
代替。你拥有它的方式,我可以输入%s
作为我的输入,printf
会在查找要打印的字符串时读取随机内存。这可能会导致任何意外行为。
答案 1 :(得分:6)
这是 UNSAFE ,因为它可能导致Format String Attack
答案 2 :(得分:0)
嗯,printf的第一个参数是格式字符串。所以函数的调用者可以通过:
foo("%d")
然后printf
将查找不存在的整数,并导致未定义的行为。一个可能的解决方法是你的函数调用:
printf("%s", var);
将printf
解释var
作为常规字符串(而不是格式)。
答案 3 :(得分:0)
Printf具有以下签名:
int printf(
const char *format [,
argument]...
);
如果用户输入格式字符,例如%s,则会发生各种不良事件。
如果您只想输出字符串,请使用puts。