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