You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

os/exec包Command方法是否存在命令注入风险?是否需sanitize输入?

Go语言os/exec包Command方法的命令注入风险与安全处理

核心结论

os/exec包的exec.Command()方法本身是安全的,只要你不通过shell间接执行命令,就不会出现命令注入问题。

为什么你的测试没触发注入?

你测试里的代码:

injection := "&& sh bash.sh"
out, err := exec.Command("ls", injection).Output()
fmt.Println(string(out), err)

这里的"&& sh bash.sh"是作为ls命令的第二个参数传入的——exec.Command()会直接把每个参数原样传递给目标程序(这里是ls),不会经过shell解析。对ls来说,它只会把这个字符串当成一个要查找的文件名,自然找不到,所以会输出错误,根本不会触发后续的sh bash.sh执行。

什么时候会有命令注入风险?

只有当你通过shell间接执行命令时,才会有注入风险。比如下面这种写法:

injection := "&& sh bash.sh"
// 用sh -c把命令拼接成字符串执行,此时shell会解析特殊字符
out, err := exec.Command("sh", "-c", "ls "+injection).Output()

这种情况下,shell会解析ls && sh bash.sh,先执行ls,再执行sh bash.sh,就会触发注入。

处理互联网文件的注意事项

如果你只是把来自互联网的文件名作为参数直接传给exec.Command()(比如exec.Command("cat", fileName)),不需要做额外的sanitize处理——因为参数不会被shell解析,不管文件名里有什么特殊字符,都会被目标程序当作普通文件名处理。

但如果你的场景需要把文件名拼接到shell命令字符串里(比如用sh -c执行),那必须对文件名做严格的sanitize,或者更安全的方式是用参数占位符(比如exec.Command("sh", "-c", "cat '$1'", "_", fileName)),避免直接拼接字符串。


内容的提问来源于stack exchange,提问作者Jason Rich Darmawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:20:40