Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 打印安全golang 我已经阅读了有关C++中的Prtff()的安全性的一些内容。 可以找到示例,例如。 这让我想知道golang的fmt.Printf()是否安全。 更具体地说,如果格式化字符串本身可以伪造,是否安全 inputString := "String from user" x := "test" fmt.Printf(inputString, x, 15) 当试图复制C++的漏洞时,Gangon似乎并不脆弱。_Security_Go_Printf - Fatal编程技术网

Security 打印安全golang 我已经阅读了有关C++中的Prtff()的安全性的一些内容。 可以找到示例,例如。 这让我想知道golang的fmt.Printf()是否安全。 更具体地说,如果格式化字符串本身可以伪造,是否安全 inputString := "String from user" x := "test" fmt.Printf(inputString, x, 15) 当试图复制C++的漏洞时,Gangon似乎并不脆弱。

Security 打印安全golang 我已经阅读了有关C++中的Prtff()的安全性的一些内容。 可以找到示例,例如。 这让我想知道golang的fmt.Printf()是否安全。 更具体地说,如果格式化字符串本身可以伪造,是否安全 inputString := "String from user" x := "test" fmt.Printf(inputString, x, 15) 当试图复制C++的漏洞时,Gangon似乎并不脆弱。,security,go,printf,Security,Go,Printf,例如,fmt.Printf(“%s%s%s%s%s%s%s%s%s%s%s\n”)不会使golang中的程序崩溃 当然,这样的分析并不能证明这在戈朗是安全的。所以我想问:go的开发者们有没有愚弄过它的printf函数 编辑:我说的万无一失是指它没有任何意外的副作用。 当然,我希望得到的字符串会被完全破坏。 我不希望用户能够获得特权信息(如未传递给printf的变量的内容),或者用户能够写入任何内存(例如,为x分配一个新值)。C/C++中的许多内存问题都与空终止和缓冲区溢出有关。Golang缺少这

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

当然,这样的分析并不能证明这在戈朗是安全的。所以我想问:go的开发者们有没有愚弄过它的printf函数

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

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

以你的例子为例。由于函数的易变性,有很多输入处理程序而没有处理程序不会影响代码。就printf所知,格式字符串不需要任何替换。由于您不能传入任何破坏性的内容,即使您的示例为'a…interface{}'获取了动态值,您也会受到编译器的字符串保护代码的保护

tl;dr:不要打印不受信任的数据,先将其转义。如果有疑问或匆忙,.

Go的字符串格式化方法确实是内存安全的,而您担心的、在C中非常普遍的特定类型的漏洞是不适用的

然而,在任何语言中,不经过仔细考虑就通过任何方式输出不可信、未初始化的输入通常都是不安全的。一个众所周知的例子就是为什么。然而,不像XSS攻击那样为人所知的是终端序列

普通终端对各种各样的转义序列做出响应,这些转义序列可能会直接做令人讨厌的事情,或者帮助攻击另一个漏洞。攻击者可以将这些序列包含在发送到目标系统的消息中(例如,发送到Web服务器的请求的URL中),并等待管理员
cat
检查日志或类似内容。这也可以用来隐藏信息——包括退格序列,可以有效地隐藏在终端视图中出现的任何信息

  • 最快的选择是简单地使用。这将字符串输出为Go字符串文字,适合在Go源代码中使用。这对于打印来说既方便又安全,但如果您试图匹配特定的格式,可能并不理想。(也将直接执行相同的操作)

  • 使用strings.Map有一个更复杂但易于自定义的选项,但是在给定的表单中,它会删除所有不可打印的字符,而不是转义它们

以这样或那样的方式清理输出。你以后会为别人,可能是你自己,省下很多痛苦

主程序包
进口(
“fmt”
“strconv”
)
func main(){
s:=“带有某些控件的字符串\x08\x08\x08\x08\x08\x08\x08\x08\x08隐藏字符”
//打印时控制字符保持不变。终端输出:
//包含一些隐藏字符的字符串
fmt.Printf(“%s\n”,s)
//打印为Go字符串文字。终端输出:
//“包含某些控件\b\b\b\b\b\b\b\b隐藏字符的字符串”
fmt.Printf(“%q\n”,s)
//打印为Go字符串文字,但不包含双引号。
//终端输出:
//带有某些控制\b\b\b\b\b\b\b隐藏字符的字符串
x:=标准报价单
fmt.Printf(“%s\n”,x[1:len(x)-1])
}

与Go的其他部分一样,它的内存安全。仍然可能是bug的来源,任何bug在正确的情况下都可能是漏洞。什么样的bug比较难对付?排除结果字符串完全控制输入字符串和结果问题?你说的万无一失是什么意思?Go中的字符串不像C中的字符串那样是等待发生的危险缓冲区溢出。数组/切片也是如此。一切都已检查且安全。@user2089648:您在编辑中添加的期望值通过
Printf
得到满足,是的。