2017-01-03 10 views
0

ローカルサーバーからphpを使用して音楽をストリーミングしようとすると、私は非常に奇妙な問題を抱えています。私は基本的なユーザ名/パスワードの権限チェックをして、ユーザがファイルをストリーミングするための正しい権限を持っていることを確認します。しかし問題はこれらのチェックにある。PHPのMP3ストリーミングの問題

phpのexit関数を使用して、ファイルを表示する権限がユーザーにない場合はスクリプトを中止し、ユーザーに通知する場合はechoを使用しています。 exit関数は、実行されなくてもストリーミングを破っているように見えます。ここで

は、私のコードのハイライトです:

function hasPermission($user,$perm) 
    { 
     if (!accountHasPermission($user,$perm)) 
     { 
      echo "<center><a style='color:indianred'>Failed to Authenticate: 1"; 
      echo "<br><br><a href='javascript:history.back()'>Go Back</a>"; 

      exit; 
     } 
    } 

    function streamTest() 
    { 
     $filename = "uploads/path_to_file"; 

     if(file_exists($filename)){ 
      header('Content-type: audio/mpeg'); 
      header('Content-Disposition: filename=' . basename($filename)); 
      header('X-Pad: avoid browser bug'); 
      header('Cache-Control: no-cache'); 
      readfile($filename); 
     }else{ 
      header("HTTP/1.0 404 Not Found"); 
     } 
    } 

    hasPermission($_POST["username"],"manageFilesWeb"); 

    streamTest(); 
    exit; 

私はhasPermission機能でexit呼び出しをコメントアウトした場合、音声は問題なくストリーミングます。クロムを使って、thisのような素晴らしいオーディオプレーヤーを手に入れました。もちろん、適切な権限を持つアカウントを使用しているため、exit関数が呼び出されることはありません。私はこれを100%確信しています。終了機能がコメントアウトされていない場合、音楽ファイルはクロムでストリームされず、オーディオプレーヤーはthisのようになります。私は複数のクロムブラウザを試して、常に同じ結果を得る。しかし、音楽は、コメントアウトされているかどうかにかかわらず、Firefoxのブラウザでストリーミングされます。

私はreturn、die、if/elseを使用するなど、さまざまなオプションを試しましたが、すべて同じ結果が得られます。

ファイルのアップロードやダウンロードなど、サーバー上の他のすべてに対してhasPermission関数を使用しています。これまで私には何の問題も与えてこなかった。出口の呼び出しが問題になる可能性があることを理解するには、数時間の試行錯誤が必要でした。

私は何が起こっているのか分かりません。ストリーミングプロセスを中断しているので、私はすでに単純なif/elseチェックを削除しなければなりませんでしたが、それ以上削除すると大幅にセキュリティを低下させることになりました。

更新:問題が見つかりました。権限チェックが問題です。ファイル転送中に_POSTデータが定義されていないため、認証チェックが失敗することがあります。これを避けるためにファイルがストリーミング中にユーザー名とパスワードを取得する方法はありますか?

  • Firefoxは常に、_POSTデータを送信するように見えます。これにより、検証チェックが成功し、ファイルストリームが有効になります。クロムは一度だけ送るように見えますが。 2つの人気ウェブサーバがあると述べたPHPアプリケーションが実行されている背後に尊敬のWebサーバのsendfile方法については、

    1. Apacheの

    使用を提供する認証済みファイルのこれらの種類については

+0

あなたはphpでApacheを使用しているWebサーバーですか? –

答えて

0

Apacheを有効にするxsendfile mod ここに最初にユーザー名を入力してくださいlogin.php

// login.php 
    // session_start & stop life cycle codes 
    username = $_POST["username"]; 
    password = $_POST["password"]; 
    if(hasPermission(username, password){ 
    $_SESSION["logined"] = true; // setting a session value for successful authentication 
    } 
    // login success 

次に、ファイルをストリーミングするためのファイルのPHPファイルを追加し、

//file.php 
    if(isset($_SESSION["logined"])){ 
      $filename = "uploads/path_to_file"; // absolute path to file 
      header('Content-type: audio/mpeg'); 
      header('Content-Disposition: filename=' . basename($filename)); 
      header('X-Pad: avoid browser bug'); 
      header('Cache-Control: no-cache'); 
      header('X-Sendfile', $filename); 
    }else{ 
     header("HTTP/1.0 404 Not Found"); // or 401 Unauthorized 
    } 

2 file.php言います。nginxのサーバー用のnginxの

はnginxののxsendfileに関連するより詳細な説明のためにhereをチェックし、X-Accel-Redirectでを置き換える除き、Apacheのセクションで説明する手順に従ってください。

+0

私はこれを撃つでしょう。セッション変数は、サーバーにアクセスしようとするユーザー、またはユーザー名とパスワードを最初に送信したデバイスにのみ適用されますか?誰もが私のファイルストリーミングに飛び込むことができれば、それは大きなセキュリティホールになるだろうと想像することができます。応答していただきありがとうございます。 –

+0

また、ファイル転送が完了したら、_SESSION変数の設定を解除したいと思いますか?これは可能でしょうか? –

+0

ファイルアクセスを制御するには、session($ _SESSION) –