ローカルサーバーから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の
使用を提供する認証済みファイルのこれらの種類については
あなたはphpでApacheを使用しているWebサーバーですか? –