如何验证上传的图片是实际图片而不是有害代码?

时间:2014-08-12 07:18:04

标签: php image image-uploading jquery-file-upload

对于图片上传网站,我需要具备基本的一致性,即上传文件是图像,而不是可能影响服务器或网站客户端的有害代码。请不要将此副本标记为以下任何问题。我也遇到了类似的问题。

需要指导在PHP和jQuery前端的实际代码实现中开始使用这种方法。

Image sanitization library

Security issues in accepting image uploads

Is it important to verify that the uploaded file is an actual image file?

1 个答案:

答案 0 :(得分:1)

第一步是尝试确定您可以使用exif_imagetype执行的图像类型,例如:

$valid_types = array('jpeg','jpg','gif','png');
if (($type = exif_imagetype($_FILES['image']['tmp_name'])) &&
    in_array(ltrim(image_type_to_extension($type), '.'), $valid_types)) {
    // image appears to be valid

为了进一步提高安全性,您应该将文件上传到无法通过浏览器访问的文件夹,并重命名该图像。例如:

$upload_path = '/path/to/uploads'; // folder ABOVE www or public_html
$hash = hash_file('sha1', $_FILES['image']['tmp_name']);
$ext = image_type_to_extension($type);
$fname = $hash . $ext;

// save it
if (move_uploaded_file($_FILES['image']['tmp_name'], "$upload_path/$fname")) {
    // image was saved

或者,您可以尝试使用GD库或Imagick重绘它,而不是使用move_uploaded_file,而只保存重绘副本。如果图像包含任何错误,那么这些库将无法绘制它。

这应该足够安全。即使用户确实设法利用某些漏洞,他们也无法执行它,除非您以可预测的方式将其反馈给他们,但它仍然不太可能。