3

您好,我对 C 语言很陌生,简而言之,我在课堂上做了以下作业:

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

有人告诉我这是不好的做法并且不安全,但我的导师没有得到太多详细的信息。我假设如果 var 的字符串值可以由用户控制,它可以用来执行缓冲区溢出吗?我将如何正确强化此代码?我是否必须限制 str 长度或其他什么?

干杯和感谢!

4

4 回答 4

6

这是不安全的,因为它可能导致格式字符串攻击

于 2013-01-21T10:45:32.457 回答
6

你应该使用:

printf("%s", var);

反而。按照你的方式,我可以输入%s作为我的输入,并printf在它寻找要打印的字符串时读取一段随机的内存。这可能会导致任何数量的意外行为。

于 2013-01-21T10:42:17.157 回答
0

嗯,printf的第一个参数是一个格式字符串。所以你的函数的调用者可以通过:

foo("%d")

然后printf会寻找一个不存在的整数,并导致未定义的行为。一种可能的解决方法是让您的函数调用:

printf("%s", var);

这将printf解释var为常规字符串(而不是格式)。

于 2013-01-21T10:43:22.490 回答
0

Printf 具有以下签名:

int printf(
   const char *format [,
   argument]... 
);

如果用户输入格式字符,例如 %s,就会发生各种不好的事情。

如果您只想输出字符串,请使用 puts。

于 2013-01-21T10:44:02.697 回答