2

我正在解决我在 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";

编辑 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

编辑 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
4

2 回答 2

5

我不认为这个特定的脚本实际上可以被利用来做任何邪恶的事情,但只要 vlc 不会在以正确的 youtube 主机开头但包含有趣内容的格式错误的 URL 上做任何邪恶的事情。因为消毒完全无效。

有 3 个错误一起意味着几乎任何东西都可以传递给 vlc,并且可以使用它找到有关系统的一些信息:

  • 第一个问题是 echo 命令。echo 是 unix shell 中最不规则的命令,在每个 shell 中的行为都非常不同。printf如果您需要将参数传递给未修改的命令的标准输入,请使用此选项。
  • 第二个问题是它的参数没有被引用(你仍然必须在命令替换中引用变量),所以它会经历分词和文件名生成(globbing)。后者可能被滥用以获取系统的一些信息。只要该命令仅具有本地效果,这是毫无价值的,但在任何网络可观察到的东西中都会出现类似的错误。此外,一些 shell(但不是 bash)可能允许文件名生成产生一些副作用,在这种情况下它会变得很危险。
  • 最后 sed 只会返回$in不匹配时的内容,然后将其直接传递给 vlc。它在此处被正确引用,因此 vlc 不会将其解释为单独的 URL 或选项,而只会将其解释为一个有趣的无效 URL。所以除非在 vlc 中使用一些严重的错误,否则它不太可能被利用。

我觉得你应该:

  1. expr使用带有正确引用的参数的命令检查参数是否采用适当的格式。
  2. 如果没有,则错误中止。
  3. 而不是简单地删除前缀,${in#*=}因为您已经检查了前缀是否存在并以 . 结尾=
于 2013-06-13T12:29:25.463 回答
0

bash中,无需使用expr

regex="^vlc://www\.youtube\.com/watch\?v=[-_a-zA-Z0-9]*$"
if [[ $in =~ $regex ]]; then
于 2013-06-13T13:26:13.793 回答