我正在解决我在Linux下使用Firefox中的Flash性能不佳的问题。
我想知道下面的代码是否安全。 input是不可信的,我觉得如果不消毒,可能是危险的。
#!/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";
编辑1:基于扬·胡德克的评论,我已经到了这一步
#!/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
编辑2(可能是最后的):
更清洁的方式来编写多个sed命令?
在Bashfunction里面的Cd
Linux Bash有一个do-while循环吗?
Bash – 更正格式(sed?)
#!/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
bash不会执行'at -f foo.sh'命令,即使使用#!/ bin / bash shebang也是如此
sh:2:1:未find – 将多个PHPparameter passing给bash脚本
如何在shell脚本中发送失败作业的电子邮件
我不认为这个特定的脚本可以被实际利用来做任何邪恶的事情,但是只要vlc不会在一个错误的URL上做任何恶意的事情,从正确的YouTube主机开始,但包含有趣的东西。 因为消毒是完全无效的。
有三个错误一起意味着几乎所有的东西都可以传递给vlc,并且可以使用它找到关于系统的一些信息:
第一个问题是echo命令。 Echo是unix shell中最不规则的命令,在每个shell中表现得非常不同。 如果您需要将参数传递给未修改的命令的标准输入,请使用printf 。
第二个问题是它的参数没有被引用(你仍然需要在命令替换中引用变量),所以它会经历分词和文件名生成(globbing)。 后者可能会被滥用以获取系统的一些信息。 只要命令只具有局部效应,这是毫无价值的,但在任何网络可观察的事物中都会有类似的错误。 另外一些shell(但不是bash)可能会允许来自文件名生成的一些副作用,在这种情况下会变得危险。
最后,sed将只是返回$in的内容,当它不匹配,你直接传递给vlc比。 它在那里被正确引用,所以vlc不会将其解释为独立的URL或选项,只能作为一个有趣的,无效的URL。 所以这是不可能被利用,除非在vlc中使用一些严重的错误。
我想你应该:
使用带正确引号的参数的expr命令检查参数是否采用适当的格式。
如果没有,则中止错误。
因为您已经检查过前缀,并且以=结尾,所以不要仅仅使用${in#*=}删除前缀。
在bash ,不需要使用expr :
regex="^vlc://www.youtube.com/watch?v=[-_a-zA-Z0-9]*$" if [[ $in =~ $regex ]]; then
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。