在将用户输入传递给%x(执行它)之前,我该如何清理它?

时间:2009-05-22 18:24:37

标签: ruby-on-rails ruby

我从用户那里获取一个输入字符串,并将其用作命令行后端程序的参数。

确保此输入“安全”的最佳方法是什么? Aka他们没有在字段中插入“; cd /; rm -rf”或其他一些丑陋的内容?

我没有任何消毒......

@query = params[:query]
@result = %x( mycommand #{@query} )

我需要获取命令的输出,所以我不能使用system(“command”,“parameters”),因为它只返回true或false但会提供保护。

我知道这很危险......提前谢谢。

4 个答案:

答案 0 :(得分:6)

始终,始终定义您接受的内容,然后拒绝其他所有内容。人们常常试图让一切都被允许,然后否认坏事。

  1. 从字符开始。即如果 mycommand只需要字母数字 输入加空格然后只允许 那。没有机会 “rm -rf /”潜入,而不是 其他10,000件需要的东西 标点符号。
  2. 还有进一步 mycommand的句法/语义 你可以用来定义“好” 输入?比如它需要2 空格分隔参数?
  3. 我不知道mycommand是什么,我不能提供具体细节,但你明白了这一点:不要试图抛弃坏事;定义有效并抛弃其他一切。请注意,这仍然很难,但如果没有这种方法,几乎​​是不可能的。

答案 1 :(得分:3)

由于执行命令的性质,我可能会说你应该使用白名单来确保只运行预期的命令。这让我感到相当危险!

答案 2 :(得分:1)

如果您在对dwc的回复中说过,您需要一个域名(我假设您的意思是完全合格)或IP地址,您可以使用Resolv对它们进行查找,只有在匹配A时才接受它们在域名的情况下为/ CNAME,在IP的情况下为PTR。

如果他们输入的IP没有反向ptr,你可能会遇到问题。如果他们输入的域名没有A / CNAME,那么你的命令很可能会失败。

答案 3 :(得分:0)

另一种选择,如果命令有界,你可以在命令下拉列表中创建一个列表,并将args放入其他字段/复选框/下拉列表中。然后像Mike建议的那样验证每个参数。

这会阻止任何用户输入的值真正进入命令行。