我有一个小应用程序,它通过执行一个进程来处理http请求,并为用户提供的查询字符串提供一些输入。我想知道什么是过滤远程执行输入的最佳方法。 PHP的替代,例如会是这样的: http://php.net/manual/en/function.escapeshellarg.php使用Golang安全地执行命令(避免远程执行)
眼下的输入应该是一个有效的URL,如果这使得它更容易,但非常一般的过滤器将是首选。
我有一个小应用程序,它通过执行一个进程来处理http请求,并为用户提供的查询字符串提供一些输入。我想知道什么是过滤远程执行输入的最佳方法。 PHP的替代,例如会是这样的: http://php.net/manual/en/function.escapeshellarg.php使用Golang安全地执行命令(避免远程执行)
眼下的输入应该是一个有效的URL,如果这使得它更容易,但非常一般的过滤器将是首选。
通常这样的魔法功能很难正确使用,如果您严重依赖它们,它们通常会让您的应用程序面临攻击。
我建议您使用智能URL /请求方案来获取运行所需的命令,并在用户请求和shell执行之间放置一定级别的解释,以免由用户直接使用参数。
您可以获得包含?verbose=true
的请求,并在命令行上将它们转换为-v
,例如。当处理像字符串这样的用户输入时,需要直接给正在运行的命令,你需要用引号做简单的转义(用一个简单的检查来查看输入是否包含引号),以确保你不会遇到“Bobby表“的问题。
另一种方法是通过管道或文件让程序和底层命令交换数据。这将减少离开命令输入的开放攻击向量的可能性。
如果您使用[os/exec](http://golang.org/pkg/os/exec/),则不会将它传递到shell,因此不需要执行shell转义。你应该非常仔细地验证输入! –
是的,使用os.exec,不知道它没有通过它很好的知道它的壳。但即使它不是像“command &&恶意”应该工作的例子? – Feras
本质上,PHP通过将进程执行卸载到shell(甚至不保证为sh兼容的shell)并使您完成安全工作而得到错误。几乎所有其他语言的os库都直接调用内核,因此可以隐式避免注入攻击。 – krait