如何验证使用 file_put_contents() 保存的图像?
How can I validate image saved with file_put_contents()?
我正在使用 file_put_contents($path, $image);
保存用户将通过插件上传的图像(slimimagecropper.com 仅供参考)。
我担心 XSS。在使用 file_put_contents()
保存 XSS 之前检查 $image
的最佳方法是什么?
您可以执行一些操作来清理用户上传的内容。 $_FILES
中的所有内容都可以被操纵,因此请完全不要相信它 。
文件名:
永远不要相信用户给您的文件名 - 始终将其保存为不同且经过净化的输入。 image.jpg.php
-> uniquestring_programatically_generated.jpg
。
获取图像大小:
使用方法getimagesize($filename)
验证它是一个实际图像,并且它有一个尺寸。
参考:PHP Validating the File Upload
要验证内容是否为图像,您应该验证:
- 它的扩展
防止远程文件上传,例如 .php
- 它的 mime 类型
额外检查以验证其文件类型
- 其内容
防止将文本上传为图片和类似内容
尝试使用此代码(取自参考)来验证扩展名和 MIME 类型:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
此代码用于验证其内容(也取自参考):
$file = $_FILES['file']['tmp_name'];
if (file_exists($file)) {
$imagesizedata = getimagesize($file);
if ($imagesizedata === FALSE) {
//not image
} else {
//image
}
}
我正在使用 file_put_contents($path, $image);
保存用户将通过插件上传的图像(slimimagecropper.com 仅供参考)。
我担心 XSS。在使用 file_put_contents()
保存 XSS 之前检查 $image
的最佳方法是什么?
您可以执行一些操作来清理用户上传的内容。 $_FILES
中的所有内容都可以被操纵,因此请完全不要相信它 。
文件名:
永远不要相信用户给您的文件名 - 始终将其保存为不同且经过净化的输入。 image.jpg.php
-> uniquestring_programatically_generated.jpg
。
获取图像大小:
使用方法getimagesize($filename)
验证它是一个实际图像,并且它有一个尺寸。
参考:PHP Validating the File Upload
要验证内容是否为图像,您应该验证:
- 它的扩展
防止远程文件上传,例如 .php - 它的 mime 类型
额外检查以验证其文件类型 - 其内容
防止将文本上传为图片和类似内容
尝试使用此代码(取自参考)来验证扩展名和 MIME 类型:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
此代码用于验证其内容(也取自参考):
$file = $_FILES['file']['tmp_name'];
if (file_exists($file)) {
$imagesizedata = getimagesize($file);
if ($imagesizedata === FALSE) {
//not image
} else {
//image
}
}