私はこれを5日間今作業しています...コードを解体して再構築しています。私はmp3ファイルを強制的にダウンロードしようとしています。特殊文字(アンパサンド、引用、アポストロフィ)がない場合、ダウンロードは正常に動作します。私はファイル内のすべてのメタデータを失っていますが、ファイルはダウンロードされ、再生可能です。PHPヘッダを強制的にダウンロードして使用できないmp3を返す
header('Content-type: audio/mpeg');
header('Content-Disposition: attachment; filename="TraxXMP3_'.$file.'"');
readfile($file);
exit;
私の謙虚な推測では、データベースからのデータが正しくサニタイズ/返却されていないです:
これは、ファイルのダウンロードのための私のダウンロードスクリプトです。しかし、私はこれを試してみました。
$var = str_replace("'","%27", $var);
$var = str_replace("%27", "'" , $var);
$var = htmlentities($var,ENT_QUOTES,'UTF-8');
$var = html_entity_decode($var,ENT_QUOTES,'UTF-8');
これらはすべてデータベースからの入力と検索を可能にします。変更された文字列としてデータベースに表示され、htmlページに戻ります。その他のエスケープされていないファイルは、問題なくダウンロードされます。エスケープされたコードがあるときだけ、それは失敗します。
出力ファイルは、エスケープ文字列によって異なります。 ... fileのような結果は転送されますが、内容はありません。または、ファイルが使用できない文字列(mp3拡張子のないファイル名の一部)とともに返されます。コメントアウト行は私が試したものです
function cleanVarsUp($var){
//$var = htmlentities($var,ENT_QUOTES,'UTF-8');
//$var = str_ireplace("\"", """, $var);
$var = str_replace("'","%27", $var);
return $var;
}
function cleanVarsDn($var){
//$var = str_ireplace("'", "'", $var);
//$var = html_entity_decode($var,ENT_QUOTES,'UTF-8');
$var = str_replace("%27", "'" , $var);
return $var;
}
:これは私の文字列エスケープファイルです
if(isset($_GET['file'])){
$file = $_GET['file'];
$sql = "SELECT * FROM main_lib WHERE file_name='.$file.' LIMIT 1";
$query = mysqli_query($db_conn, $sql) or die (mysqli_error());
while ($row = mysqli_fetch_array($query)) {
$count_dl = $row['count_dl'];
}
//mysqli_free_result($query);
mysqli_query($db_conn, "UPDATE main_lib SET count_dl='$count_dl'+1 WHERE file_name='$file'");
/**
*
* EMAIL SCRIPT HERE
*
*/
mysqli_free_result($query);
$file = cleanVarsDn($file);
header('Content-type: audio/mpeg');
header('Content-Disposition: attachment; filename="TraxXMP3_'.$file.'"');
readfile('../data/lib/'.$file);
exit;
}
:
これは、ファイル全体のダウンロードのヘッダファイルです。注...このスクリプトは動作します。非化成化されたデータではありません。 私はここで完全に失われています。新人プログラマーではなく、プロではない。