我正在解决我在Linux下的Firefox中表现不佳的问题.
我想知道以下代码是否安全.输入是不可信的,我觉得如果没有消毒,可能会很危险.
#!/bin/bash
#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;
out=`echo $in | sed -r 's/vlc:\/\/www\.youtube\.com\/watch\?v=([-_a-zA-Z0-9]*).*$/\1/g'`;
vlc "http://www.youtube.com/watch?v=$out";
Run Code Online (Sandbox Code Playgroud)
编辑1:基于Jan Hudec的评论,我已经谈到了这一点
#!/bin/bash
#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;
if [ `expr "$in" : '^vlc://www.youtube.com/watch?v=[-_a-zA-Z0-9]*$'` -gt 0 ]
then
vlc "http${in:3}";
fi
Run Code Online (Sandbox Code Playgroud)
编辑2(可能是最终):
#!/bin/bash
#in="vlc://www.youtube.com/watch?v=yVpbFMhOAwE"
in=$1;
if expr "$in" : '^vlc://www.youtube.com/watch?v=[-_a-zA-Z0-9]*$' >/dev/null
then
vlc "http${in:3}";
fi
Run Code Online (Sandbox Code Playgroud)
我不认为这个特定的脚本可以被实际利用来做任何邪恶的事情,但只要vlc不会在格式错误的URL上做任何恶意,从正确的youtube主机开始,但包含有趣的东西.因为消毒完全无效.
有3个错误在一起意味着几乎任何东西都可以传递给vlc,并且可以使用它找到有关系统的一些信息:
printf如果需要参数传递到未修改的命令的标准输入.$in不匹配的内容,并将其直接传递给vlc.它在那里被正确引用,因此vlc不会将其解释为单独的URL或选项,仅作为一个有趣的无效URL.所以除非在vlc中使用一些严重的bug,否则它不太可能被利用.我想你应该:
expr带有正确引用参数的命令检查参数是否采用适当的格式.${in#*=}因为你已经检查了前缀是否存在并以此结束=.