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

この特定のスクリプトが実際に悪用される可能性はないと思いますが、正しい youtube ホストで始まり、面白いものを含む不正な形式の URL に対して vlc が何も悪用しない場合に限ります。消毒は全く効果がないからです。

ほとんどすべてのものを vlc に渡すことができ、それを使用してシステムに関するいくつかの情報が見つかる可能性があることを意味する 3 つの間違いがあります。

  • 最初の問題は、echo コマンドです。Echo は UNIX シェルの最も変則的なコマンドであり、各シェルで非常に異なる動作をします。printfパラメータを変更せずにコマンドの標準入力に渡す必要がある場合に使用します。
  • 2 番目の問題は、引数が引用符で囲まれていない (コマンド置換で変数を引用符で囲む必要がある) ため、単語の分割とファイル名の生成 (グロビング) が行われることです。後者は、システムの一部の情報を取得するために悪用される可能性があります。コマンドがローカルでしか効果がない限り、これは価値がありませんが、ネットワークで観測可能なものには同様の間違いがあります。また、一部のシェル (ただし bash ではない) では、ファイル名の生成による副作用が発生する可能性があり、その場合は危険になります。
  • 最後に、sed は$in一致しない場合のコンテンツを返すだけで、それを直接 vlc に渡します。そこでは適切に引用されているため、vlc はそれを個別の URL やオプションとして解釈せず、1 つの面白い無効な 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 に答える