安全处理字符串变量

时间:2013-01-21 10:37:33

标签: c string security variables printf

你好,我对C很陌生,简而言之,我作为课堂作业的一部分做了以下工作:

foo (char *var) {
  printf(var);
}

有人告诉我,这是不好的做法和不安全因素,但我的导师没有得到很多关于此的详细信息。我假设如果var的字符串值可由用户控制,它可能用于执行缓冲区溢出?我如何正确强化此代码?我是否必须限制str长度?

干杯&谢谢!

4 个答案:

答案 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。