PHP 怎么PHP HSTS

wen PHP项目 2

本文目录导读:

PHP 怎么PHP HSTS

  1. 在 PHP 代码中设置 Header
  2. 在 PHP 配置文件中设置(多个页面共用)
  3. 使用 .htaccess(Apache)
  4. 使用 nginx 配置
  5. HSTS 参数说明
  6. 完整的 PHP 实现示例
  7. 注意事项

在 PHP 中实现 HSTS(HTTP Strict Transport Security)主要有以下几种方法:

在 PHP 代码中设置 Header

基础设置

// 在页面输出的最顶部设置
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');

完整设置(推荐)

// 强制 HTTPS 并设置 HSTS
if ($_SERVER['HTTPS'] != 'on' && $_SERVER['HTTP_X_FORWARDED_PROTO'] != 'https') {
    header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], true, 301);
    exit;
}
// 设置 HSTS(仅在 HTTPS 连接时发送)
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
}

带预加载的 HSTS

header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');

在 PHP 配置文件中设置(多个页面共用)

创建公共配置文件 config.php

<?php
// config.php
function enforceHTTPS() {
    // 强制 HTTPS
    if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
        $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        header("Location: " . $redirect_url, true, 301);
        exit();
    }
    // 设置 HSTS header
    header("Strict-Transport-Security: max-age=31536000; includeSubDomains; preload");
}
// 调用函数
enforceHTTPS();

然后在其他 PHP 文件中引用:

<?php
require_once 'config.php';
// 其他代码...

使用 .htaccess(Apache)

如果使用 Apache,可以在 .htaccess 中设置:

# 强制 HTTPS 并设置 HSTS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 设置 HSTS Header
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

使用 nginx 配置

server {
    listen 443 ssl;
    # ... SSL 配置 ...
    # 设置 HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    # 将 HTTP 重定向到 HTTPS
}

HSTS 参数说明

// 不同的参数组合
$hsts_params = [
    // 基础 - 有效期 1 年
    'max-age=31536000',
    // 包含子域名
    'max-age=31536000; includeSubDomains',
    // 包含预加载请求
    'max-age=31536000; includeSubDomains; preload',
    // 开发环境 - 较短有效期
    'max-age=86400',
    // 测试时禁用
    'max-age=0'
];
// 使用示例
header('Strict-Transport-Security: ' . $hsts_params[2]);

完整的 PHP 实现示例

<?php
class SecurityHeaders {
    public static function applyHSTS() {
        // 检查是否 HTTPS
        $is_https = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') 
                    || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
        if ($is_https) {
            // 生产环境配置
            if ($_SERVER['SERVER_NAME'] === 'example.com') {
                header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
            } else {
                // 开发/测试环境
                header('Strict-Transport-Security: max-age=3600; includeSubDomains');
            }
            // 其他安全 header
            header('X-Content-Type-Options: nosniff');
            header('X-Frame-Options: SAMEORIGIN');
            header('X-XSS-Protection: 1; mode=block');
        }
    }
}
// 调用
SecurityHeaders::applyHSTS();

注意事项

重要提示:

  • HSTS 只应在 HTTPS 连接下设置,在 HTTP 下设置无效
  • 设置 preload 参数需要先提交到 HSTS Preload List
  • 一旦浏览器缓存 HSTS,无法通过 HTTP 访问,需要等缓存过期
  • 测试时建议使用短有效期,如 max-age=3600

验证是否生效:

# 使用 curl 检查 header
curl -I https://your-domain.com
# 或使用浏览器开发者工具查看响应头

正确的 HSTS 实现能够有效防止 SSL 剥离攻击,显著提升网站安全性,但需要注意,一旦启用,需要确保 HTTPS 配置完全正确并长期维护。

抱歉,评论功能暂时关闭!