gpt4 book ai didi

c - 向 printf 调用添加长度说明符是否更安全

转载 作者:太空狗 更新时间:2023-10-29 16:08:12 26 4
gpt4 key购买 nike

我的问题是从安全角度出发的。我正在清理一些代码,我发现当前代码存在不受控制的格式字符串漏洞;它正在将一个字符串传递给 printf(),例如:

void print_it(char * str)
{
printf(str);

这显然被认为是不安全的编程,即使是 gcc 通常也会至少发出某种警告:

warning: format not a string literal and no format arguments

现在要“修复”这个问题,我们可以确保您得到的内容被视为字符串

printf("%s", str);

但我想知道使用长度指定器是否还有任何...额外的安全性。像这样的东西:

printf("%.*s", (int)sizeof(str), str);

我想不出有什么理由会更安全,但如果我在这里遗漏了一些明显的东西,我也不会感到惊讶。

最佳答案

有点,但还没有达到现代 C 商店如此安全地保护其 printf 语句的程度。当您处理非空终止字符串时使用它,这在与 Fortran 代码交互时非常常见。

严格来说,为了防止读取失控,这将是一种安全增益,也许您正要在违反的空字符后打印敏感数据。

但是

printf("%.*s", (int)sizeof(str), str);

更糟;您刚刚说“忽略空字符并打印出全部内容”。或者更确切地说,除非您一直处理空格填充的字符串直到它们的内存结束,否则情况会更糟,如果字符串来自 Fortran,则可能是这种情况。

然而极其重要:

printf("%s", str);

as printf(str) 是一个主要的安全漏洞。了解 printf attacks使用 %n 说明符,写入

关于c - 向 printf 调用添加长度说明符是否更安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15279549/

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