gpt4 book ai didi

c - 如何根据参数列表验证用户提供的 printf 格式字符串?

转载 作者:行者123 更新时间:2023-12-02 05:11:35 25 4
gpt4 key购买 nike

我有一个数字列表,希望我的用户可以选择输入 printf 样式的格式字符串来指定数字的输出方式。

如何根据我的参数列表验证用户提供的格式字符串?格式错误的输入不应使程序崩溃,我想避免任何格式字符串攻击。

我不关心验证是否只处理 POSIX 中指定的格式选项或编译器特定的超集。是否有任何图书馆调用来执行此操作,还是我必须自己编写?

澄清:我需要的是这样的:

float var1, var2, var3, var4;
// var1 .. var2 are given by the program
const char * userSupplied = getFormatStringFromUser();

if( isValidFormat( userSupplied, "float", "float", "float", "float" ) )
printf( userSupplied, var1, var2, var3, var4 );
else
printf( "The format you gave was invalid!\n" );

在这个例子中,我知道我有四个 float 。我想允许任何仅引用零到四个 float 的格式。

因此 isValidFormat() 应该允许以下格式字符串:

  • “%f %g %e %.1f”
  • “Foo 是 %g,Bar 是 %g”
  • “没什么”

虽然应拒绝以下内容:

  • “%s”
  • “Foo 是 %d”

最佳答案

不要将用户输入的字符串传递给 printfprintf 的格式字符串接口(interface)是为代码设计的,而不是为人工输入设计的。你会发现,如果你只是制定自己的格式字符串规范,你将可以自由地为用户设计它。

您是否有理由要对您的用户强加完全混淆的 printf 格式字符串规范?

本质上,您是在请求帮助编写一些东西来将您的格式字符串规范转换为 printf 格式字符串规范。相反,我建议您编写代码,根据用户输入的字符串构造 printf 格式字符串。这样更安全,也更灵活。即使它有更多的代码,也不会那么 hacky。

关于c - 如何根据参数列表验证用户提供的 printf 格式字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5301357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com