大家好,我对C语言很陌生,简而言之,作为我课堂作业的一部分,我做了以下工作:
foo (char *var) {
printf(var);
}我被告知这是不好的做法和不安全的,但我的导师没有得到关于这方面的详细信息。我假设如果var的字符串值是用户可控制的,那么它可以用来执行缓冲区溢出?我该如何正确地强化这些代码呢?我必须限制字符串的长度吗?
干杯&谢谢!
发布于 2013-01-21 18:42:17
您应该使用:
printf("%s", var);而不是。按照这种方式,我可以输入%s作为我的输入,printf会在查找要打印的字符串时随机读取一块内存。这可能会导致任何数量的意外行为。
发布于 2013-01-21 18:45:32
这是不安全的,因为它可能导致Format String Attack
发布于 2013-01-21 18:43:22
嗯,printf的第一个参数是一个格式化字符串。所以你的函数的调用者可以传递:
foo("%d")然后printf会查找一个不存在的整数,并导致未定义的行为。一种可能的修复方法是让您的函数调用:
printf("%s", var);这将使printf将var解释为常规字符串(而不是格式)。
https://stackoverflow.com/questions/14436801
复制相似问题