4

URL から動的に決定されたファイルをユーザーがダウンロードできるようにする必要がある状況にあります。ダウンロードを開始する前に認証を行う必要があるため、最初にスクリプトを実行してダウンロードする必要があります。手動でのダウンロードを防ぐために、すべてのファイルは Web ルートの外に保存されます。

たとえば、次のいずれかがダウンロード リンクである可能性があります。

基本的に、フォルダの深さはさまざまです。

ディレクトリのトラバーサルを防ぐには、次のようにします: http://example.com/downloads/../../../../etc/passwd 明らかに URI をチェックする必要があります。(注: この情報をデータベースに保存するオプションはありません。URI を使用する必要があります)

次の正規表現は、ユーザーが怪しいものを入力しないようにする上で防弾となりますか?

preg_match('/^\/([-_\w]+\/)*[-_\w]+\.(zip|gif|jpg|png|pdf|ppt|png)$/iD', $path)

URIが正常であることを確認する他のオプションはありますか? おそらくPHPでリアルパスを使用していますか?

4

6 に答える 6

3

私はPHP開発者ではありませんが、このようなシナリオで正規表現ベースの保護を使用することは、ハリケーンに対してTシャツを着るようなものです。

この種の問題は、セキュリティ用語での正規化の脆弱性として知られています(これにより、OSがファイル名を絶対ファイルパスに変換する前に、アプリケーションが特定のファイル名を解析します)。攻撃者は、ファイル名の任意の数の順列を思い付くことができますが、これはほぼ確実に正規表現と一致しません。

正規表現を使用する必要がある場合は、可能な限り悲観的にします(有効なファイル名のみを照合し、それ以外はすべて拒否します)。PHPの正規化メソッドについて調査することをお勧めします。

于 2009-03-04T17:17:34.673 に答える
1

次の3つのチェックが理想的な解決策になると思います

  • ファイルが、ファイルパスがどのように見えるかについて一般的に受け入れられている正規表現と一致することを確認してください
  • realpath(PHPの場合)を使用して、ユーザーが要求したファイルの正規形を取得し、それを比較して、ベースディレクトリ内にあることを確認します
  • PHP v5.3以降では、ini_setを使用してopen_basedirを特定のフォルダーに制限できるため、そのフォルダー外のファイルを読み取ることができなくなります(fopen、include、freadなど)。
于 2009-03-04T20:32:29.167 に答える
0

私の解決策

$filesPath = realpath(".");
$reqPath = realpath($_GET["file"]);
$pat = "%^".preg_quote($filesPath)."%";

if(preg_match($pat,$reqPath)){
    echo "File found";
}else{
    echo "Access denied"
}
?>
于 2011-02-16T12:39:01.753 に答える