0

ユーザーが自分の Web サイトからオーディオをダウンロードできるようにする PHP プログラムをプログラミングしています。
これを行うには、 www.mysite.com/downloadit.php?file= myfile.mp3 にアクセスすると、myfile.mp3 ダウンロードがすぐに開始されます。ただし、問題があります。人々がシステム ファイルをダウンロードできるようにしたくありません。部分文字列またはが含まれているかどうかを確認して、これを解決します。コマンドでこれを実行しようとしていますが、機能させることができません。文字列内の複数の部分文字列 (.mp3 および .wav) をチェックするにはどうすればよいですか? それとも、別のコマンドを使用する必要がありますか? 私にお知らせください! これまでの私のコードは次のとおりです。

$_GET['file'].mp3.wavstrposstrpos

$haystack=$_GET['file'];

$resulting = strpos($haystack, ".mp3");

//if found $resulting will equal 1
//if not found $resulting will equal 0

//if $resulting is less than one then it must be 0

    if($resulting < 1){
    //security breach!
    die("Unauthorized");
}

//assuming we passed the last test, everything went well, we will then continue

    else{
    //code here
}

@DoubleSharp のおかげで、この完成したコードが完成しました!!!

//if it is found $resulting will not equal 0
//if it is not found $resulting will equal 0

//echo the result
//echo $resulting;

//add a line break
echo "<br/>";
//if $resulting is less than one then it must be 0
//since it is 0 it must mean that it is a breach!
if (preg_match("~\.(mp3|wav)$~i", $haystack))
{
  echo "hi nice file";
}
else
{
  die("bad file");
}
?>
4

2 に答える 2

2

正規表現を使用して、複数の値、特にpreg_match(). \.(mp3|wav)$~i区切り記号で囲まれたパターンを使用すると(この場合)、リテラル ドットの後にorが続く~文字列に一致します。パターン内の は行末に一致し、末尾の修飾子は大文字と小文字を区別しない一致を行うように指示するため、と の両方が一致します。.mp3wav$ifile.MP3file.mp3

if ( preg_match("~\.(mp3|wav)$~i", $haystack) ) {
    // it matches
}
于 2013-05-15T21:24:25.780 に答える
2

私は次のようなものを提案します:

$allowed = array('mp3', 'wav', 'ogg'); //whatever

$file = basename($_GET['file']);  // strip the path! (if any)

if(!preg_match("/\.(?:".implode('|', $allowed).")$/", $file){
   // Show 404, or whatever, exit
}

// Now check under trusted directories for the file,
// which should help to ensure that no system files are
// accessed since there shouldn't be any in there
于 2013-05-15T21:34:01.930 に答える