【发布时间】:2016-01-27 16:45:15
【问题描述】:
我有一个 Golang 程序,它从命令行读取字符串参数并将其传递给 fmt.Sprintf 函数。假设 tmp_str 是命令行的目标字符串。
package main
import "fmt"
func main() {
tmp_str := "hello %s"
str := fmt.Sprintf(tmp_str, "world")
fmt.Println(str)
}
在某些情况下,程序会传递一个完整的字符串,如“Hello Friends”,而不是字符串模板。程序会恐慌并返回:
你好朋友%!(EXTRA string=world)
那么,如何忽略 fmt.Sprintf 的额外字段?
【问题讨论】:
-
我不确定 Go 的 fmt 库是否存在与 C 相同的安全问题,但为了安全起见,您永远不应该使用来自不受信任来源的格式字符串。在 C 中,这会导致信息泄漏,例如打印出敏感的堆栈数据,甚至数据覆盖和代码执行。
-
@ZanLynx 感谢更新。我只是简化了这个问题。该程序肯定不会暴露给其他人。
-
@Zan Lynx Go 的 fmt 库和常规 Go 代码的其他地方没有这样的安全问题。这并不意味着随意处理格式字符串是个好主意。
标签: go