检查图像是否确实是图像 php
Check that an image is actually an image php
所以我有这个脚本可以将图像上传到服务器。
它允许 jpg 和 png 并将文件重命名为随机的 6 位数字。
<?php
if (isset($_FILES['file'])) {
$file = $_FILES['file'];
$file_name = $file['name'];
$file_tmp = $file['tmp_name'];
$file_size = $file['size'];
$file_error = $file['error'];
$file_ext = explode('.', $file_name);
$file_ext = strtolower(end($file_ext));
$allowed = array(
'jpg',
'png'
);
if (in_array($file_ext, $allowed)) {
if ($file_error === 0) {
if ($file_size <= 10000000) {
$file_name_new = mt_rand(100000, 999999) . '.' . $file_ext;
$file_destination = 'files/' . $file_name_new;
if (move_uploaded_file($file_tmp, $file_destination)) {
echo "<a href='$file_destination'>$file_name_new</a>";
}
}
}
}
}
?>
一切正常。它只允许具有指定扩展名.jpg 和.png 的文件。
我 运行 遇到的问题是您可以将 script.txt 等 txt 文件重命名为 [=26= .jpg 并且服务器将允许它,但它实际上不是图像。这提供了攻击的漏洞。
有什么我可以添加的东西可以实际验证正在上传的文件是图像吗?我听说过有关 getimagesize 的消息,但我不确定。我是 php.
的新手
您需要使用文件的 mimetype 才能知道它是什么类型的文件。扩展名不相关。
确实,您可以使用 getimagesize
来做到这一点:
<?php
...
$size = getimagesize($file_name));
switch ($size['mime']) {
case "image/gif":
echo "Image is a gif";
break;
case "image/jpeg":
echo "Image is a jpeg";
break;
case "image/png":
echo "Image is a png";
break;
case "image/bmp":
echo "Image is a bmp";
break;
}
?>
来源:http://php.net/manual/en/function.image-type-to-mime-type.php
所以我有这个脚本可以将图像上传到服务器。 它允许 jpg 和 png 并将文件重命名为随机的 6 位数字。
<?php
if (isset($_FILES['file'])) {
$file = $_FILES['file'];
$file_name = $file['name'];
$file_tmp = $file['tmp_name'];
$file_size = $file['size'];
$file_error = $file['error'];
$file_ext = explode('.', $file_name);
$file_ext = strtolower(end($file_ext));
$allowed = array(
'jpg',
'png'
);
if (in_array($file_ext, $allowed)) {
if ($file_error === 0) {
if ($file_size <= 10000000) {
$file_name_new = mt_rand(100000, 999999) . '.' . $file_ext;
$file_destination = 'files/' . $file_name_new;
if (move_uploaded_file($file_tmp, $file_destination)) {
echo "<a href='$file_destination'>$file_name_new</a>";
}
}
}
}
}
?>
一切正常。它只允许具有指定扩展名.jpg 和.png 的文件。
我 运行 遇到的问题是您可以将 script.txt 等 txt 文件重命名为 [=26= .jpg 并且服务器将允许它,但它实际上不是图像。这提供了攻击的漏洞。
有什么我可以添加的东西可以实际验证正在上传的文件是图像吗?我听说过有关 getimagesize 的消息,但我不确定。我是 php.
的新手您需要使用文件的 mimetype 才能知道它是什么类型的文件。扩展名不相关。
确实,您可以使用 getimagesize
来做到这一点:
<?php
...
$size = getimagesize($file_name));
switch ($size['mime']) {
case "image/gif":
echo "Image is a gif";
break;
case "image/jpeg":
echo "Image is a jpeg";
break;
case "image/png":
echo "Image is a png";
break;
case "image/bmp":
echo "Image is a bmp";
break;
}
?>
来源:http://php.net/manual/en/function.image-type-to-mime-type.php