PHP 怎么PHP SameSite

wen PHP项目 2

本文目录导读:

PHP 怎么PHP SameSite

  1. PHP 7.3+ 原生支持
  2. PHP 7.3 之前的兼容方案
  3. 使用 session 设置 SameSite
  4. 各值说明
  5. 完整示例
  6. 注意事项

在 PHP 中设置 SameSite Cookie 属性有几种方法,主要取决于你使用的 PHP 版本和设置方式。

PHP 7.3+ 原生支持

PHP 7.3 开始,setcookie()setrawcookie() 函数支持 SameSite 参数:

使用数组方式(推荐)

setcookie(
    'cookie_name', 
    'cookie_value',
    [
        'expires' => time() + 3600,
        'path' => '/',
        'domain' => 'example.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Lax'  // Lax | Strict | None
    ]
);

使用传统参数方式

setcookie(
    'cookie_name',
    'cookie_value',
    time() + 3600,  // expires
    '/',            // path
    'example.com',  // domain
    true,           // secure
    true,           // httponly
    ['samesite' => 'Lax']  // 需要放在最后
);

PHP 7.3 之前的兼容方案

对于老版本 PHP,可以通过修改 header() 来实现:

// 直接在 header 中设置
header('Set-Cookie: cookie_name=cookie_value; expires=Timestamp; path=/; samesite=Lax');
// 或者动态生成
$cookie_name = 'cookie_name';
$cookie_value = 'cookie_value';
$expires = time() + 3600;
$path = '/';
$domain = 'example.com';
header(
    'Set-Cookie: ' . $cookie_name . '=' . urlencode($cookie_value) . 
    '; expires=' . gmdate('D, d M Y H:i:s T', $expires) . 
    '; path=' . $path . 
    '; domain=' . $domain . 
    '; samesite=Lax'
);

使用 session 设置 SameSite

对于 session cookie:

PHP 7.3+

session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
session_start();

老版本 PHP

// 在 session_start() 之前
header('Set-Cookie: PHPSESSID=' . session_id() . '; path=/; samesite=Lax; Secure; HttpOnly');
session_start();

各值说明

说明
Strict 完全禁止跨站请求携带 Cookie
Lax 允许部分安全的跨站 GET 请求携带(默认推荐)
None 允许所有跨站请求携带(需配合 Secure,且 HTTPS)

完整示例

class CookieHelper {
    public static function set($name, $value, $expire = 0, $path = '/', $domain = '', $secure = false, $httponly = true, $samesite = 'Lax') {
        if (PHP_VERSION_ID >= 70300) {
            setcookie($name, $value, [
                'expires' => $expire,
                'path' => $path,
                'domain' => $domain,
                'secure' => $secure,
                'httponly' => $httponly,
                'samesite' => $samesite
            ]);
        } else {
            // 兼容老版本
            header(
                'Set-Cookie: ' . $name . '=' . urlencode($value) .
                '; expires=' . ($expire ? gmdate('D, d M Y H:i:s T', $expire) : '') .
                '; path=' . $path .
                ($domain ? '; domain=' . $domain : '') .
                ($secure ? '; Secure' : '') .
                ($httponly ? '; HttpOnly' : '') .
                '; samesite=' . $samesite
            );
        }
    }
}
// 使用
CookieHelper::set('user_token', 'abc123', time() + 3600, '/', '', true, true, 'Lax');

注意事项

  1. SameSite=None 必须配合 Secure
  2. 浏览器兼容性:Chrome 51+、Firefox 60+、Safari 12.1+ 支持
  3. 安全建议:业务非必要跨站用户 Cookie 建议设置为 StrictLax

根据你的 PHP 版本选择合适的实现方式即可。

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