تابع md5_file() در PHP
تابع md5_file() در PHP برای محاسبه مقدار هش MD5 از محتوای یک فایل استفاده میشود. این تابع سریع و ساده است و معمولاً برای تولید چکسام (checksum) فایلها، بررسی تغییرات یا تشخیص فایلهای تکراری کاربرد دارد. با این حال باید مرزهای استفادهی امن آن را شناخت؛ چرا که MD5 دیگر برای کاربردهای رمزنگاری حساس توصیه نمیشود.
امضای تابع و حالت بازگشتی
امضای تابع بهصورت زیر است:
string|false md5_file ( string $filename , bool $raw_output = false )شرح پارامترها:
- $filename: مسیر فایل (میتواند مسیر محلی یا برخی stream wrapperها باشد اگر allow_url_fopen فعال باشد).
- $raw_output: اگر true باشد، خروجی به صورت باینری خام خواهد بود؛ در حالت پیشفرض (false) خروجی یک رشته هگزادسیمال ۳۲ کاراکتری است.
مثال پایه
$hash = md5_file('/path/to/file.txt');
if ($hash === false) {
echo 'Error reading file';
} else {
echo 'MD5: ' . $hash;
}این کد مقدار MD5 فایل را به صورت هگزادسیمال برمیگرداند و در صورت خطا false باز میگردد. معمولاً پیش از فراخوانی بهتر است با فایلسیستم بررسیهایی مثل file_exists() و is_readable() انجام شود.
کاربردهای معمول
- تأیید یکپارچگی فایل پس از دانلود یا انتقال (چکسام).
- تشخیص فایلهای تکراری (deduplication) با ذخیره هش در دیتابیس.
- سرعتسنجی ساده یا مقایسه نسخهها بین سرورها.
مثال: بررسی آپلود کاربر
if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
$hash = md5_file($_FILES['file']['tmp_name']);
// ذخیره $hash در دیتابیس یا مقایسه با هشهای قبلی
echo 'Uploaded file MD5: ' . $hash;
}در این مثال از md5_file بر روی فایل موقتی آپلود شده استفاده شده تا بتوان هش را دریافت و برای مقاصدی مانند جلوگیری از آپلود مجدد ذخیره کرد.
مقایسه md5_file با hash_file و توابع جریان (stream)
| تابع | قابلیت | توصیه |
|---|---|---|
| md5_file() | MD5 فقط، ساده و سریع | برای چکسام غیرحساس مناسب؛ نه برای امنیت قوی |
| hash_file() | پشتیبانی از الگوریتمهای مختلف (sha256, sha512,…) | برای نیازهای امنیتی یا طول هش بالاتر توصیه میشود |
| hash_init()/hash_update() + stream | کنترل حداکثری روی خواندن فایل (مناسب برای فایلهای بزرگ) | برای حافظه محدود یا پردازش تدریجی فایلها مفید است |
مثال استفاده از hash_file با SHA-256
$sha256 = hash_file('sha256', '/path/to/file.txt');
echo 'SHA256: ' . $sha256;این روش جایگزین امنتری نسبت به md5_file است و برای مواردی که نیاز به امنیت بالاتر یا مقاومت در برابر تصادم دارید مناسبتر است.
خواندن فایلهای خیلی بزرگ — نمونه با hash_init
$context = fopen('/path/to/large.file', 'rb');
$ctx = hash_init('sha256');
while (!feof($context)) {
$data = fread($context, 1 << 20); // خواندن 1 مگابایت در هر تکرار
hash_update($ctx, $data);
}
$final = hash_final($ctx);
fclose($context);
echo $final;این کد فایل بزرگ را بخشبهبخش میخواند و هش را بدون بارگذاری کل فایل در حافظه محاسبه میکند؛ برای فایلهای بسیار بزرگ یا محیطهای با حافظه محدود توصیه میشود.
نکات امنیتی و هشدارها
- MD5 برای رمزنگاری حساس مناسب نیست. MD5 نسبت به حملات تصادم (collision) آسیبپذیر است؛ برای اهداف امنیتی مانند چککردن امضای دیجیتال یا ذخیره پسورد از الگوریتمهای قویتری (SHA-256، SHA-3، bcrypt، Argon2 برای پسورد) استفاده کنید.
- هنگام مقایسه هشها برای جلوگیری از حملات زمانبندی (timing attacks) از hash_equals() استفاده کنید، نه مقایسه ساده رشتهای.
- md5_file میتواند با stream wrapperها کار کند اما در مواردی که allow_url_fopen غیرفعال است روی URL کار نمیکند.
مثال مقایسه ایمن
$expected = 'd41d8cd98f00b204e9800998ecf8427e';
$actual = md5_file('/path/to/file.txt');
if ($actual !== false && hash_equals($expected, $actual)) {
echo 'File is intact';
} else {
echo 'File mismatch or error';
}استفاده از hash_equals از لحاظ امنیتی بهتر است چون زمان اجرای آن متأثر از پیشوند مشترک دو رشته نیست و احتمال حمله زمانبندی را کاهش میدهد.
خطاها و کنترل شرایط نامطلوب
- md5_file در صورت عدم دسترسی به فایل یا خطا، مقدار false بازمیگرداند؛ همیشه بررسی کنید.
- برای مسیرهای پویا ابتدا file_exists() و is_readable() را چک کنید تا از خطاهای ناگهانی جلوگیری شود.
- در محیطهایی با اجازههای محدود، ممکن است لازم باشد از error handling مناسب (try/catch یا بررسی بازگشتی) استفاده کنید.
جمعبندی و توصیههای عملی
md5_file() ابزار مناسبی برای محاسبه سریع چکسام و تشخیص فایلهای تکراری است، اما برای موارد حساس امنیتی توصیه به استفاده از hash_file() با الگوریتمهای قویتر یا استفاده از توابع رمزنگاری مناسب برای پسوردها میشود. برای فایلهای بزرگ از خواندن تدریجی و hash_init/hash_update استفاده کنید و همیشه در مقایسه هشها از hash_equals بهره ببرید.
آیا این مطلب برای شما مفید بود ؟




