通过URL输入防止注入

时间:2012-11-12 02:50:54

标签: ruby-on-rails security unix

在我的Rails控制器中,我获取用户输入的URL并运行系统命令wget

system("wget #{url}")

我担心用户可能会输入类似www.google.com && rm -rf .的内容,这会让控制器执行命令

system("wget www.google.com && rm -rf .")

删除所有内容。我应该如何防止这种攻击?我不确定用户可以用什么其他东西来损害我的系统。

3 个答案:

答案 0 :(得分:3)

this thread

您可以通过将参数单独传递给脚本来避免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}")