我有以下代码:
$filecheck = basename($_FILES['imagefile']['name']);
$ext = substr($filecheck, strrpos($filecheck, '.') + 1);
if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") &&
($_FILES["imagefile"]["size"] < 2120000)){
} else {
echo "F2";
die();
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是检查上传的文件是否是jpg/gif/png并且其大小小于2兆.
如果它大于2兆,或者不是正确的文件类型,我需要返回/ echo F2(api的错误代码).
当我使用上面的代码处理70k jpg文件时,它返回F2.
SUBNOTE 图片即时上传的扩展名为.JPG.案件可能是一个因素吗?如果是这样,我如何适应?
And*_*ore 22
请注意,您可能不希望依赖文件扩展名来确定文件类型..png例如,某人上传具有扩展名的可执行文件相当容易.恶意客户端也可以轻易伪造mime-type作为图像传递.依赖该信息是一种安全风险.
PHP文档:
如果浏览器提供此信息,则为文件的mime类型.一个例子是"image/gif".但是,在PHP端没有检查这个mime类型,因此不会将其值视为理所当然.
尝试使用gd(getimagesize())加载图像以确保它们实际上是有效的图像(而不仅仅是假装有图像文件标题的随机文件...... finfo_file依赖于这些标题).
if($_FILES["imagefile"]["size"] >= 2120000) {
echo "F2";
die();
} else {
$imageData = @getimagesize($_FILES["imagefile"]["tmp_name"]);
if($imageData === FALSE || !($imageData[2] == IMAGETYPE_GIF || $imageData[2] == IMAGETYPE_JPEG || $imageData[2] == IMAGETYPE_PNG)) {
echo "F2";
die();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您确实必须使用扩展来验证文件是否是图像,请使用strtolower()将扩展名设置为小写.
$filecheck = basename($_FILES['imagefile']['name']);
$ext = strtolower(substr($filecheck, strrpos($filecheck, '.') + 1));
if (!(($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") &&
($_FILES["imagefile"]["size"] < 2120000))){
echo "F2";
die();
}
Run Code Online (Sandbox Code Playgroud)
SUBNOTE图片即时上传的扩展名为.JPG.案件可能是一个因素吗?如果是这样,我如何适应?
是的,这就是问题所在.你应该在这一行添加strtolower():
$ext = substr($filecheck, strrpos($filecheck, '.') + 1);
Run Code Online (Sandbox Code Playgroud)
喜欢:
$ ext = strtolower(substr($ filecheck,strrpos($ filecheck,'.')+ 1));
这将解决您当前的问题.但从技术上讲,你不应该担心文件扩展名,你应该只需要检查MIME类型
比较$ext == "jpg"只是检查$ext是否正好是"jpg".
在进行这些比较之前,您可能希望在$ ext上使用strtolower来处理".JPG"情况.
如果您使用的是PHP <= 5.2,则可能需要使用mime_content_type来检查文件的内容类型,而不是依赖于$_FILES['imagefile']['name']和/或$_FILES["imagefile"]["type"]都是由客户端发送的 - 并且因此可能是伪造的.
如果你正在使用PHP> = 5.3,你可能要考虑新的扩展FileInfo的,它的finfo_file功能
对于文件的大小,您已经在使用$_FILES["imagefile"]["size"]; 没错,我猜,但是你只会在上传文件时知道 - 但是,在上传之前没有真正的方法来检查那种东西,我担心......
你可能能够找到一些JS代码在文件上传之前对扩展进行第一次预检 - 但是你仍然需要检查服务器端,因为客户端做的任何事情本身都不安全.
不确定你可以对文件的大小做同样的事情,但是......
某些浏览器可能支持一个名为的隐藏字段MAX_FILE_SIZE(请参阅有关文件上载的文档); 但不确定它是否真的得到支持(实际上从未见过它;所以可能不是:-()
作为旁注,您可能希望配置upload_max_filesize,因此它允许上传至少与您想要的一样大(默认情况下,它通常设置为2MB;所以应该已经可以了)