2014-05-22 122 views
1

我有一个小应用程序,它通过执行一个进程来处理http请求,并为用户提供的查询字符串提供一些输入。我想知道什么是过滤远程执行输入的最佳方法。 PHP的替代,例如会是这样的: http://php.net/manual/en/function.escapeshellarg.php使用Golang安全地执行命令(避免远程执行)

眼下的输入应该是一个有效的URL,如果这使得它更容易,但非常一般的过滤器将是首选。

+1

如果您使用[os/exec](http://golang.org/pkg/os/exec/),则不会将它传递到shell,因此不需要执行shell转义。你应该非常仔细地验证输入! –

+0

是的,使用os.exec,不知道它没有通过它很好的知道它的壳。但即使它不是像“command &&恶意”应该工作的例子? – Feras

+1

本质上,PHP通过将进程执行卸载到shell(甚至不保证为sh兼容的shell)并使您完成安全工作而得到错误。几乎所有其他语言的os库都直接调用内核,因此可以隐式避免注入攻击。 – krait

回答

4

通常这样的魔法功能很难正确使用,如果您严重依赖它们,它们通常会让您的应用程序面临攻击。

我建议您使用智能URL /请求方案来获取运行所需的命令,并在用户请求和shell执行之间放置一定级别的解释,以免由用户直接使用参数。

您可以获得包含?verbose=true的请求,并在命令行上将它们转换为-v,例如。当处理像字符串这样的用户输入时,需要直接给正在运行的命令,你需要用引号做简单的转义(用一个简单的检查来查看输入是否包含引号),以确保你不会遇到“Bobby表“的问题。

另一种方法是通过管道或文件让程序和底层命令交换数据。这将减少离开命令输入的开放攻击向量的可能性。

+0

我已经在做你建议的第一部分了,问题在于第二个参数是使用该命令提供给该命令的URL你认为使用双引号对URL进行编码并且使用双引号括起来是足够安全的。再次,这不是关键任务,但我宁愿没有这样的巨大洞穴。 – Feras

+0

这应该足够了。 – mbanzon

+0

(并且写出真正的,非常好的测试) – elithrar