诡异的输出:printf(const char* format [, argument]… );

作者:半瓶墨水 链接:http://www.2maomao.com/blog/printf-wierd-why/

连着两天遇到这个问题,记一下。

这是一个文本搜索的小工具,为了输出所要的结果,我写了一个很类似printf的函数,也是接受一个format字符串,一个变参,内部处理了一下(遇到中文就输出其unicode码),然后调用vprintf。

一开始都好好的,当我开始搜用DJango写的代码的时候,输出的结果里面总是有一些灵异的数字。

呵呵其实原因很简单,试试这个输出就知道了:
printf(”{% if not logged_in %}”);

DJango模板中经常有”{% if”这种字符串出现,而”%i”又是printf的格式串,结果就输出了一个神秘的数字。

修正的方法很简单,改成类似于这样的调用就行了:
printf(”%s”, “{% if not logged_in %}”);

避免这类问题发生的方法是:
输出可疑字符串(比如从文件中读出来的字符串)的时候一直使用printf(”%s”, str)这种格式。

  • Share/Bookmark

1 条评论

  • Googol 四月 20th, 2008 5:14 下午

恩,printf(str)是C里一个很常见的错误,而且如果str是用户输入的内容,那这还是一种不安全的代码。黑客可以伪装用户输入%d之类的来获得一些参数压栈的信息。

而且,更进一步,可以通过控制str的内容,来改写栈内容。printf有一个控制字%n,是把当前输出的字符串长度写入到对应的变量里。与压栈信息结合,可以实现向任意内存写入任意数值的目的。

发表评论

  • :l
  • :)
  • :q
  • :(
  • :^
  • :x
  • :v
  • :D
  • :s
  • :h
  • :e
  • :X
  • :k
  • :w
  • :d
  • :p

注意:评论中需包含至少一个中文字,否则视为无效

Additional comments powered by BackType