上传图片时检测真实的文件类型,鉴别错误的扩展名
应用场景:JPG格式具有高压缩率,更适于互联网传播,本站仅支持上传JPG格式的图片,但部分用户会直接将 PNG 或 BMP 格式的图片修改扩展名为 JPG,绕开系统限制。可采用以下方法进行检测:1、打开 source/class/discuz/discuz_upload.php 文件,查找:
$attach['size'] = intval($attach['size']); 在其前方增加:
$filename = $attach['tmp_name']; $file = fopen($filename, "rb"); $bin = fread($file, 2); fclose($file); $strinfo = @unpack("C2chars", $bin); $typecode = intval($strinfo['chars1'].$strinfo['chars2']); if(in_array($typecode, array('7173', '6677', '13780'))) { $attach['unsupported_image_format'] = 1; }
2、打开 source/class/forum/forum_upload.php 文件,查找:
loadcache('attachtype');
在其前方增加:
if($upload->attach['unsupported_image_format'] == '1') { return $this->uploadmsg(51); }
3、打开 static/js/forum_post.js 文件,查找:
'11' : '今日您已无法上传那么大的附件'
将其替换为:
'11' : '今日您已无法上传那么大的附件', '51' : '图像格式不支持,请转换为 .JPG'
更新缓存,刷新发帖页面后测试(将一张PNG格式图片的扩展名修改为JPG,上传测试,失败则表示成功)。 为了确保上传的图片确实是JPG格式,而不是通过修改扩展名绕过系统限制的其他格式(如PNG或BMP),可以通过检测文件的真实类型来实现。以下是一个详细的解决方案,基于你提供的代码片段进行扩展和优化。
### 1. 修改 `source/class/discuz/discuz_upload.php` 文件
在 `discuz_upload.php` 文件中,我们需要添加代码来检测文件的真实类型。具体来说,我们可以通过读取文件的前几个字节来判断文件的真实格式。
// 在 $attach = intval($attach); 之前添加以下代码
$filename = $attach['tmp_name']; // 获取上传文件的临时路径
$file = fopen($filename, "rb");
$bin = fread($file, 2); // 读取文件的前2个字节
fclose($file);
$strinfo = @unpack("C2chars", $bin); // 解包二进制数据
$typecode = intval($strinfo['chars1'].$strinfo['chars2']); // 获取文件类型代码
// 判断文件类型代码是否为JPG格式
if(!in_array($typecode, array(255, 216))) { // JPG文件的文件头是 FF D8
$attach['error'] = 51; // 设置错误代码为51,表示文件格式不支持
}
### 2. 修改 `source/class/forum/forum_upload.php` 文件
在 `forum_upload.php` 文件中,我们需要检查上传过程中是否出现了格式不支持的错误。
// 在 loadcache('attachtype'); 之前添加以下代码
if($upload->attach['error'] == 51) {
return $this->uploadmsg(51); // 返回错误信息
}
### 3. 修改 `static/js/forum_post.js` 文件
在 `forum_post.js` 文件中,我们需要添加一个新的错误提示信息,用于在前端显示格式不支持的提示。
// 找到 '11' : '今日您已无法上传那么大的附件',并在其后添加
'11' : '今日您已无法上传那么大的附件',
'51' : '图像格式不支持,请转换为 .JPG'
### 4. 更新缓存并测试
完成上述修改后,更新Discuz的缓存,并刷新发帖页面进行测试。你可以尝试上传一个将扩展名修改为 `.jpg` 的PNG文件,如果系统能够正确识别并拒绝上传,说明修改成功。
### 5. 其他注意事项
- **安全性**:确保文件上传功能的安全性,避免用户上传恶意文件。
- **性能**:文件类型检测可能会增加服务器的一定负担,建议在高并发场景下进行性能测试。
- **兼容性**:确保修改后的代码与Discuz的其他功能兼容,避免引入新的问题。
通过以上步骤,你可以有效地检测上传图片的真实类型,防止用户通过修改扩展名绕过系统限制。如果你有其他问题或需要进一步的帮助,请随时联系。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]