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

SWR*_*SWR 3 ruby ruby-on-rails

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

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

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

@query = params[:query]
@result = %x( mycommand #{@query} )
Run Code Online (Sandbox Code Playgroud)

我需要得到命令的输出,所以我不能使用system("command","parameters"),因为它只返回true或false但会提供保护.

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

dwc*_*dwc 6

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

  1. 从字符开始.即如果 mycommand只需要字母数字输入加空格,那么只允许这样做.没有机会rm -rf /"偷偷摸摸",也不会有其他需要标点符号的其他10,000件事.
  2. 是否还有mycommand 可用于定义"好"输入的语法/语义?比如它需要2个空格分隔的参数?

不知道什么mycommand是我无法提供的具体细节,但你明白了这一点:不要试图抛弃坏事; 定义有效并抛弃其他一切.请注意,这仍然很难,但如果没有这种方法,几乎​​是不可能的.