我有一个带有图片上传选项的php表单,如下所示
<input type="hidden" name="old_picture" value="<?php if (!empty($old_picture)) echo $old_picture; ?>" />
<label for="new_picture">Picture:</label>
<input type="file" id="new_picture" name="new_picture" />
和php脚本类似
if (!empty($new_picture)) {
if ((($new_picture_type == 'image/gif') || ($new_picture_type == 'image/jpeg') || ($new_picture_type == 'image/pjpeg') ||
($new_picture_type == 'image/png')) && ($new_picture_size > 0) && ($new_picture_size <= MM_MAXFILESIZE) &&
($new_picture_width <= MM_MAXIMGWIDTH) && ($new_picture_height <= MM_MAXIMGHEIGHT)) {
if ($_FILES['file']['error'] == 0) {
// Move the file to the target upload folder
$target = MM_UPLOADPATH . basename($new_picture);
if (move_uploaded_file($_FILES['new_picture']['tmp_name'], $target)) {
// The new picture file move was successful, now make sure any old picture is deleted
if (!empty($old_picture) && ($old_picture != $new_picture)) {
@unlink(MM_UPLOADPATH . $old_picture);
}
}
else {
// The new picture file move failed, so delete the temporary file and set the error flag
@unlink($_FILES['new_picture']['tmp_name']);
$error = true;
echo '<p class="error">Sorry, there was a problem uploading your picture.</p>';
}
}
}
else {
// The new picture file is not valid, so delete the temporary file and set the error flag
@unlink($_FILES['new_picture']['tmp_name']);
$error = true;
echo '<p class="error">Your picture must be a GIF, JPEG, or PNG image file no greater than ' . (MM_MAXFILESIZE / 1024) .
' KB and ' . MM_MAXIMGWIDTH . 'x' . MM_MAXIMGHEIGHT . ' pixels in size.</p>';
}
}
每件事情都运行正常,但是当我试图上传一个.zip文件时,问题就出现了,但是没有加载图像,但它刷新了我的数据库。该用户的所有条目都已删除。
现在我想要一些关于如何防止这种情况的建议
提前致谢
答案 0 :(得分:0)
在客户端,你可以做的事情并不多,你可以真正依赖。但它可以帮助防止意外问题。
将此属性添加到文件上传控件以限制文件类型:accept="image/gif, image/jpeg"
如果您想确定自己获得的内容,则需要在服务器端进行验证。
检查$_FILES['uploadctl']['size']
是否有文件大小,看它是否超出了您的限制。
您可以通过在php.ini中设置upload_max_filesize
来强制php限制它接受的文件上传大小。默认值非常低。
您真的不相信上传文件的扩展名实际上是正确的。仅仅因为它说.jpg
并不意味着它真的存在。如果您接受的只是图像,则应该能够使用getimagesize()
验证mimetype。如果您接受更大范围的文件,请使用Fileinfo检查文件。
如果删除了数据库中的条目,则代码中可能存在逻辑问题,而您在此处未显示。