printf 安全 golang

use*_*648 5 security printf go

我已经阅读了一些关于 C++ 中 printf() 的安全性。例如可以在这里找到示例。这让我想知道fmt.Printf()来自 golang 是否安全。更具体地说,如果格式化字符串本身可以伪造是否安全。

inputString := "String from user"
x := "test"
fmt.Printf(inputString, x, 15)
Run Code Online (Sandbox Code Playgroud)

当试图从 C++ 复制漏洞时,golang 似乎并不容易受到攻击。

例如fmt.Printf("%s%s%s%s%s%s%s%s%s%s%s%s\n"),不会使 golang 中的程序崩溃。

当然,这样的分析并不能证明这在 golang 中是安全的。所以我想在这里问:go 的开发人员是否对其 printf 函数进行了万无一失?

编辑:通过万无一失,我的意思是它没有任何意外的副作用。我当然希望得到的字符串完全受到损害。我不希望用户能够获得特权信息(例如未传递给 printf 的变量内容),或者用户能够写入任何内存(例如,为 x 分配新值)。

Vir*_*ndi 3

C/C++ 中的许多内存问题都与空终止和缓冲区溢出有关。Golang 缺少这两点。字符串是托管资源。除非存在编译器错误,否则不可能以转义到堆栈的方式终止字符串。

就拿你的例子来说吧。由于函数的可变特性,拥有大量输入处理程序而没有处理程序不会影响代码。据 printf 所知,格式字符串不需要替换任何内容。由于您不能传递任何破坏性的内容,即使您的示例采用“a ...interface{}”的动态值,您也会受到编译器的字符串保护代码的保护。