在我的Rails控制器中,我获取用户输入的URL并运行系统命令wget
:
system("wget #{url}")
我担心用户可能会输入类似www.google.com && rm -rf .
的内容,这会让控制器执行命令
system("wget www.google.com && rm -rf .")
删除所有内容。我应该如何防止这种攻击?我不确定用户可以用什么其他东西来损害我的系统。
答案 0 :(得分:3)
您可以通过将参数单独传递给脚本来避免shell扩展:
system("/bin/wget", params[:url])
根据Kernel#system的文档,此表单不会调用shell。像&&
这样的构造是shell构造,所以如果你使用这个形式,那么param将作为参数传递给/bin/wget
。
尽管如此,仍然怀疑输入,尽可能清理,如果可行的话,将其作为非特权(或更好的,被监禁的)用户运行。
答案 1 :(得分:2)
将命令与&&
(或;
或|
)一起加入是一个shell功能,而不是wget
本身可以理解的功能。如果您正在使用将命令行传递给shell的函数(例如许多语言中的system()
函数),那么您将面临风险。如果直接执行wget
程序(而不是执行shell并给它一个命令行),那么你将不会受到特定攻击的威胁。
但是,攻击者仍然可以执行其他操作,例如滥用wget
的{{1}}选项来覆盖文件。你最好不要使用-O
- 如果你的目标是下载一个文件,为什么不直接使用HTTP库在你自己的程序代码中呢?
答案 2 :(得分:2)
如果您只想检索URL的内容,最好完全避免使用'system'或任何其他在服务器上运行命令的方法。
您可以使用http客户端(如Httparty)来获取网址内容。
response = HTTParty.get("#{url}")