我正在构建一个守护进程来帮助我管理我的服务器。 Webmin 工作正常,就像打开服务器的 shell 一样,但我更希望能够从我设计的 UI 控制服务器操作,并向最终用户公开一些功能。
守护进程将从队列中获取 Action 并执行它们。但是,由于我将接受用户的输入,我想确保不允许他们将危险的东西注入(inject)到特权 shell 命令中。
这里有一个片段可以说明我的问题:
def perform
system "usermod -p #{@options['shadow']} #{@options['username']}"
end
解释更多的要点:https://gist.github.com/773292
我不确定典型的输入转义和清理是否足以满足这种情况,而且作为一名设计师,我没有大量与安全相关的经验。 我知道这对我来说应该是显而易见的事情,但事实并非如此!
我如何确保将创建和序列化操作的 Web 应用程序不会将危险文本传递到接收操作的特权进程中?
谢谢你的帮助
套利
最佳答案
看起来您的工作不需要 shell 。请参阅此处的 system
文档:http://ruby-doc.org/core/classes/Kernel.html#M001441
您应该使用 system
的第二种形式。您上面的示例将变为:
system 'usermod', '-p', @options['shadow'], @options['username']
一个更好的(IMO)写法是:
system *%W(usermod -p #{@options['shadow']} #{@options['username']})
这种方式的参数直接传递到 execve
调用中,因此您不必担心偷偷摸摸的 shell 技巧。
关于ruby - 在 Ruby 中形成卫生 shell 命令或系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4650636/