我从用户那里获取一个输入字符串,并将其用作命令行后端程序的参数。
确保此输入“安全”的最佳方法是什么? Aka他们没有在字段中插入“; cd /; rm -rf”或其他一些丑陋的内容?
我没有任何消毒......
@query = params[:query]
@result = %x( mycommand #{@query} )
我需要获取命令的输出,所以我不能使用system(“command”,“parameters”),因为它只返回true或false但会提供保护。
我知道这很危险......提前谢谢。
答案 0 :(得分:6)
始终,始终定义您接受的内容,然后拒绝其他所有内容。人们常常试图让一切都被允许,然后否认坏事。
mycommand
只需要字母数字
输入加空格然后只允许
那。没有机会
“rm -rf /
”潜入,而不是
其他10,000件需要的东西
标点符号。mycommand
的句法/语义
你可以用来定义“好”
输入?比如它需要2
空格分隔参数?我不知道mycommand
是什么,我不能提供具体细节,但你明白了这一点:不要试图抛弃坏事;定义有效并抛弃其他一切。请注意,这仍然很难,但如果没有这种方法,几乎是不可能的。
答案 1 :(得分:3)
由于执行命令的性质,我可能会说你应该使用白名单来确保只运行预期的命令。这让我感到相当危险!
答案 2 :(得分:1)
如果您在对dwc的回复中说过,您需要一个域名(我假设您的意思是完全合格)或IP地址,您可以使用Resolv对它们进行查找,只有在匹配A时才接受它们在域名的情况下为/ CNAME,在IP的情况下为PTR。
如果他们输入的IP没有反向ptr,你可能会遇到问题。如果他们输入的域名没有A / CNAME,那么你的命令很可能会失败。
答案 3 :(得分:0)
另一种选择,如果命令有界,你可以在命令下拉列表中创建一个列表,并将args放入其他字段/复选框/下拉列表中。然后像Mike建议的那样验证每个参数。
这会阻止任何用户输入的值真正进入命令行。