php文件上传 你真的掌握了吗

下面就为你详细讲解“php文件上传 你真的掌握了吗”的完整攻略。

下面就为你详细讲解“php文件上传 你真的掌握了吗”的完整攻略。

1. 为什么需要学习文件上传

文件上传是web开发中非常基础的一个功能,常用于网站上传头像、上传附件等操作。但是,文件上传有很多的安全隐患,如果不正确使用,会导致网站被黑客攻击。因此,学习文件上传的原理和安全措施对于web开发者来说非常重要,这有助于我们编写更加安全可靠的代码。

2. 文件上传的原理

文件上传的原理是通过表单提交,在表单中添加一个type=file的input元素,当用户选择一个文件后,通过POST提交,后台通过$_FILES数组获取上传的文件信息,然后处理这些信息。

3. 文件上传的安全

由于文件上传涉及到用户上传的文件,因此要处理用户可能上传的恶意文件或者通过上传漏洞攻击网站的黑客,一定要注意安全。

以下是文件上传的几种常见安全问题:

  • 文件类型:黑客可以通过将恶意文件重命名成常见文件的扩展名来绕过文件类型检测。要对文件类型进行判断,并进行严格过滤。
  • 文件大小:上传文件大小限制应该根据实际情况设置,防止上传过大的文件,影响服务器性能,并且可能存在攻击风险。
  • 文件路径:上传文件时要注意文件路径,不能让用户随意指定文件路径,防止黑客上传恶意文件到服务器指定目录等攻击方式。

针对上述问题,应该采取以下安全策略:

  • 限制上传文件类型:定义允许上传的文件类型,使用白名单方式进行过滤。
  • 限制上传文件大小:定义最大上传文件大小,如果上传文件超过大小限制,则应该予以拒绝。
  • 保存上传文件到独立目录:保存上传文件到独立目录,防止上传文件覆盖网站其他文件,同时对于目录应该设置合适权限,防止产生非法文件读取等风险。

4. 文件上传的步骤

下面给出文件上传的简单步骤:

  1. 构建包含上传文件表单的页面。
  2. 通过$_FILES数组获取上传的文件信息
  3. 进行文件类型、文件大小和文件路径的检查,判断是否安全上传。
  4. 文件上传。

具体操作可以参考下面的示例说明。

5. PHP 文件上传实例1

以下示例定义了一个上传表单,允许上传png和jpeg类型的文件,文件大小限制为2MB. 这段代码防止了HTML注入攻击 和 单引号双引号转义攻击

<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select image to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="php-progress" />
  <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html>

代码解析:

  • enctype="multipart/form-data"定义表单数据的编码类型为 multipart/form-data,这样表单处理程序才能正确地处理表单中上传的文件。
  • 文件大小验证:
// Check file size
if ($_FILES["fileToUpload"]["size"] > 2000000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}
  • 文件类型验证:

定义了一个白名单数组 $allowed_types,允许上传的文件类型仅为png和jpeg类型文件。验证代码如下:

$allowed_types = array('png','jpeg');
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Allow certain file formats
if(!in_array($imageFileType, $allowed_types)) {
    echo "Sorry, only PNG or JPEG are allowed.";
    $uploadOk = 0;
}
  • 文件上传

如果上传验证通过,则可通过move_uploaded_file()将文件上传到服务器指定目录,如下:

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

6. PHP 文件上传实例2

以下示例定义了一个上传表单,并生成了一个唯一的文件名,确保上传文件不重复。文件类型和文件大小的验证同上面的示例。这段代码防止了HTML注入攻击 和 单引号双引号转义攻击

$target_dir = "uploads/";
$filename=uniqid();
//生成唯一文件名
$target_file = $target_dir .$filename. "." . strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));
$uploadOk = 1;

// Check file size
if ($_FILES["fileToUpload"]["size"] > 2000000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

// Allow certain file formats
$allowed_types = array('png','jpeg');
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if(!in_array($imageFileType, $allowed_types)) {
    echo "Sorry, only PNG or JPEG are allowed.";
    $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
  } else {
    echo "Sorry, there was an error uploading your file.";
  }
}

代码解析:

  • 生成唯一文件名
$filename=uniqid();
$target_file = $target_dir .$filename. "." . strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));
  • 文件上传
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

7. 总结

使用 PHP 实现文件上传功能需要注意文件类型、文件大小和文件路径三个方面。做安全处理时我们应该:对上传文件的类型和大小进行验证,设置合适的文件上传路径,为上传成功的文件设置唯一的名称,规范上传功能的使用。以上示例可以帮助开发者更深层次地理解 PHP 文件上传的基本原理和安全技巧。

本文标题为:php文件上传 你真的掌握了吗

基础教程推荐