0

Firefox を使用してダウンロードしたファイルの署名証明書が無効であるという問題があります。IE、Opera、Safari、Chrome はすべて問題ありません。FF のリンクをクリックしてファイルを直接ダウンロードした場合も問題ありませんが、セキュリティのために PHP を使用してファイルをダウンロードした場合は 1 バイト大きくなり、最後に x0A が追加され、これが検証チェックに失敗する原因になっていると思います。 . PHP は非常に単純です。

<?php
$file = "../downloads/".$_GET['link'];
$size = filesize($file);
$type = filetype($file);
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary");  
header( "Content-Disposition: attachment; filename=".basename($file));
header("Content-Length: ".$size); 
header("Content-Type: ".$type);
readfile($file);
?>

ここでサイズを取得する際に Firefox だけで問題が発生する理由を知っている人はいますか? どんなアイデアにも感謝します。

4

3 に答える 3

4
  1. ファイルが存在し、許可された場所に配置されているかどうかを確認します - 攻撃者は Web サーバー上のほぼすべてのファイルをダウンロードできるようになりました
  2. 終了の phptag を使用しないでください -?>の後のすべての空白はブラウザに送信されます
  3. exit;readfile の直後に使用して、出力を生成する他の関数が呼び出されないようにします。
于 2012-03-10T08:39:19.457 に答える
1

Content-Type ヘッダーを確認します。後者が使用されるように 2 回設定します。関数 filetype() により、「Content-Type: file」のようなものになる可能性があります。ブラウザは「file」コンテンツ タイプを理解できません。そしてそれをテキストファイルとして受け取ります。それが余分な 0x0a の原因だと思います。
コメント "header("Content-Type: ".$type);" そしてそれはうまくいくでしょう。

于 2012-03-10T08:44:16.047 に答える
0

下の行を置き換える

<?php
header("Content-Length: ".strlen($file));
?>

幸運を :)

于 2012-03-10T08:38:05.367 に答える