printf和不安全的格式化字符串

时间:2012-02-08 14:54:42

标签: c printf string-formatting user-input

有问题的应用程序允许用户在纯文本配置文件中定义自己的消息(主要用于自定义和/或本地化目的),这些消息在运行时传递给printf样式的函数。如果用户定义的格式化字符串有问题,可能会发生很多不好的事情。

清理此类用户输入的格式字符串的最佳方法是什么?或者我应该完全放弃这种方法并使用另一种方法让用户安全地自定义消息?

解决方案必须以某种方式移植(Windows,Linux,BSD,x86,x86-64)。

2 个答案:

答案 0 :(得分:5)

定义您自己的格式化语言,您的代码将转换为有效的格式字符串,从而限制用户可以遇到的麻烦(例如,根本不允许%,并定义您自己的符号/标记用于指示%应出现在输出中。)

答案 1 :(得分:0)

您有两种选择:

  1. 让用户的混乱(有意或无意)弄乱自己,即不要让用户的个人配置互相干扰

  2. 不要让用户自定义结果。或者,如果你这样做,那么使定制变得如此有限,以致他们无能为力,这是有害的 例如,我经常做一些事情,允许用户为printf()之类的东西提供自己的输入,但过滤器只允许具有特定(非常有限)字符集的事物。例如,我将使用^[a-zA-Z0-9_]+$之类的正则表达式,不要让任何其他内容。

  3. 只要您提供定制,就可以打开问题的大门。在这些场地中小心行走。