PHP服务器安全详细说明

  1. 更新PHP版本

    • 及时更新PHP到最新稳定版本,修复已知安全漏洞。

  2. 禁用危险函数

    • php.ini中禁用eval()exec()system()等危险函数。

  3. 配置open_basedir

    • 限制PHP脚本访问的文件系统路径,防止目录遍历攻击。

  4. 设置disable_functions

    • 禁用不必要的PHP函数,减少潜在攻击面。

  5. 错误报告

    • 生产环境中关闭错误显示,避免泄露敏感信息。

    • 使用error_reporting(0)display_errors = Off

  6. 文件上传安全

    • 限制上传文件类型和大小,确保文件存储目录不可执行。

    • 使用$_FILES['file']['type']$_FILES['file']['size']验证文件。

  7. SQL注入防护

    • 使用预处理语句(PDO或MySQLi)防止SQL注入。

    • 示例:$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");

  8. XSS防护

    • 输出数据时使用htmlspecialchars()htmlentities()转义特殊字符。

  9. 会话安全

    • 使用session_regenerate_id()防止会话固定攻击。

    • 设置session.cookie_httponly = 1session.cookie_secure = 1

  10. CSRF防护

    • 使用CSRF令牌验证表单提交。

    • 示例:<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

  11. 文件权限

    • 确保Web服务器用户对文件有最小必要权限。

    • 示例:chown www-data:www-data /var/www/html

  12. 日志监控

    • 启用PHP错误日志和Web服务器日志,定期检查异常活动。

案例

SQL注入攻击案例

// 不安全代码
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = $conn->query($sql);

// 安全代码
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

XSS攻击案例

// 不安全代码
echo $_GET['name'];

// 安全代码
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');

文件上传漏洞案例

// 不安全代码
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);

// 安全代码
$allowed_types = ['image/jpeg', 'image/png'];
$max_size = 2 * 1024 * 1024; // 2MB
if (in_array($_FILES["file"]["type"], $allowed_types) && $_FILES["file"]["size"] <= $max_size) {
    $target_dir = "uploads/";
    $target_file = $target_dir . uniqid() . '.' . pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION);
    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
} else {
    echo "Invalid file type or size.";
}

本篇文章内容来源于:php服务器安全详细说明以及案例