ファイルアップロードは、Webサイト開発の非常に一般的な機能ですが、それに伴う問題は、アップロードされたファイルの整合性とセキュリティを確保する方法です。ファイルは、転送中に改ざんされるか、悪意のあるファイルがアップロードされている場合があります。 PHPは便利な機能MD5_FILE()を提供します。これにより、開発者はファイルのMD5検証コードをすばやく計算し、ファイルが改ざんまたは破損しているかどうかを確認できます。
MD5_FILE()は、指定されたファイルのMD5ハッシュ値を直接計算し、32ビット文字列を返すPHPビルトイン関数です。 MD5ハッシュ値を使用して、ファイルコンテンツが一貫しているかどうかを検出できます。ファイルコンテンツに変更がある場合、対応するMD5値は異なります。
関数プロトタイプ:
string md5_file ( string $filename [, bool $raw_output = false ] )
$ filename :ファイルパス。
$ raw_output :デフォルトでfalseにデフォルトで返すかどうかは、32ビットの16進数文字列を返します。
アップロードされたファイルの整合性を確認します<br> ユーザーがファイルをアップロードすると、サーバーはアップロードされたファイルのMD5値を計算し、アップロード前にクライアントが計算したMD5値と比較して、ファイルが改ざんされていないことを確認します。
重複したアップロードを防ぐ<br> MD5値を使用して、同じコンテンツを持つファイルがサーバーに既に存在するかどうかを判断して、冗長ストレージを避けます。
安全テスト<br> ファイルのMD5値を、既知の悪意のあるファイルのMD5値ライブラリと比較して、危険なファイルをフィルタリングできます。
以下は、 Md5_file()を使用してファイルの整合性を確認する簡単なファイルアップロード例です。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
$uploadDir = '/var/www/uploads/';
$uploadedFile = $_FILES['upload_file']['tmp_name'];
$originalName = $_FILES['upload_file']['name'];
// アップロードされたファイルを計算します md5 価値
$md5Hash = md5_file($uploadedFile);
// ここでは、クライアントに送信できますmd5価値比对,クライアントが来ているとしますmd5価値
$clientMd5 = $_POST['client_md5'] ?? '';
if ($clientMd5 && $md5Hash !== $clientMd5) {
echo "アップロードされたファイルの整合性検証に失敗しました,ファイルが改ざんされている可能性があります。";
exit;
}
// 繰り返されるアップロードを防ぎます(例で簡単に使用しますmd5ファイル名として)
$destination = $uploadDir . $md5Hash;
if (file_exists($destination)) {
echo "ファイルはすでに存在します,繰り返しアップロードする必要はありません。";
} else {
if (move_uploaded_file($uploadedFile, $destination)) {
echo "ファイルアップロードに正常にアップロードします,MD5価値为:$md5Hash";
} else {
echo "ファイルのアップロードに失敗しました。";
}
}
} else {
?>
<form method="post" enctype="multipart/form-data" action="http://m66.net/upload.php">
ファイルを選択してください:<input type="file" name="upload_file" required><br>
書類MD5検証コード(オプション):<input type="text" name="client_md5"><br>
<button type="submit">アップロード</button>
</form>
<?php
}
?>
フロントエンドユーザーは、最初にツールを使用してファイルのMD5を計算し、フォームのclient_md5フィールドに入力できます。サーバー側は、アップロードされたファイルのMD5をこの値と比較します。
サーバー側は、ファイルのMD5値を保存名として使用して、ファイルのアップロードを繰り返し防止します。
move_uploaded_file()関数は、ファイルが一時的なディレクトリからターゲットディレクトリに安全に移動することを保証します。
ファイルタイプを制限します:アップロードする前に、ファイル拡張子とMIMEタイプを確認します。
ファイルサイズの制限:過度のサーバー圧力が過度のファイルをアップロードするのを防ぎます。
HTTPSを使用してください:ファイル転送プロセスが中間者によって攻撃されないことを確認してください。
定期的に悪意のあるファイルライブラリを更新します:ファイルMD5を使用して既知のウイルスデータベースと比較して、危険なファイルをフィルタリングします。
アップロードディレクトリへの直接アクセスを避けてください:セキュアなストレージパスと許可コントロールを使用します。