ZetCode

Dart SameSite

最后修改于 2025 年 4 月 4 日

Dart 中的 SameSite 类为 Cookie 提供了安全属性。它通过控制 Cookie 的行为来帮助防止跨站请求伪造 (CSRF) 攻击。

SameSite 是 Dart dart:io 库的一部分,并与 Cookie 类一起使用。它为 Cookie 定义了三种安全级别。

基本定义

SameSite 是一个枚举,用于指定 Cookie 安全策略。它决定了 Cookie 何时会随跨站请求一起发送。

这三个值是 LaxStrictNone。每个值都为 Cookie 传输提供了不同的安全级别。

SameSite.Lax 示例

本示例展示了如何设置具有 Lax 安全策略的 Cookie。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('session', 'abc123');
  cookie.sameSite = SameSite.lax;
  
  print('Cookie: ${cookie.name}=${cookie.value}');
  print('SameSite: ${cookie.sameSite}');
}

我们创建一个带有 Lax 策略的会话 Cookie。Lax 允许来自其他站点的安全 HTTP 方法(如 GET)携带 Cookie。它是平衡安全的默认设置。

$ dart main.dart
Cookie: session=abc123
SameSite: SameSite.lax

SameSite.Strict 示例

本示例演示了最严格的 SameSite 策略。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('auth', 'xyz789');
  cookie.sameSite = SameSite.strict;
  cookie.secure = true; // Requires HTTPS
  
  print('Cookie: ${cookie.toString()}');
}

Strict 策略会阻止所有跨站 Cookie 传输。我们还设置了 Secure 标志,因为 Strict 通常出于安全考虑需要 HTTPS。

$ dart main.dart
Cookie: auth=xyz789; SameSite=Strict; Secure

SameSite.None 示例

本示例展示了一个没有 SameSite 限制的 Cookie。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('prefs', 'darkmode');
  cookie.sameSite = SameSite.none;
  cookie.secure = true; // Required for None
  
  print('Cookie header: ${cookie.toString()}');
}

None 允许跨站 Cookie 传输,但需要 Secure 标志。这对于在 iframe 或跨站 API 中使用的 Cookie 是必需的。

$ dart main.dart
Cookie header: prefs=darkmode; SameSite=None; Secure

Cookie 类集成

本示例展示了 SameSite 与完整的 Cookie 配置。

main.dart
import 'dart:io';

void main() {
  var cookie = Cookie('user', 'john_doe')
    ..path = '/account'
    ..maxAge = 3600
    ..httpOnly = true
    ..sameSite = SameSite.lax
    ..secure = true;
  
  print('Set-Cookie: ${cookie.toString()}');
}

我们配置了一个安全的、HTTP Only 的 Cookie,并设置了 path、max age 和 Lax 策略。这展示了带有 SameSite 的典型生产环境 Cookie 设置。

$ dart main.dart
Set-Cookie: user=john_doe; Path=/account; Max-Age=3600; HttpOnly; SameSite=Lax; Secure

HTTP 服务器示例

本示例在真实的 HTTP 服务器环境中展示了 SameSite Cookie。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  print('Server running on ${server.address}:${server.port}');

  await for (var request in server) {
    var response = request.response;
    
    var cookie = Cookie('visits', '1')
      ..sameSite = SameSite.lax
      ..maxAge = 86400;
    
    response.cookies.add(cookie);
    response.write('Cookie set with SameSite=Lax');
    await response.close();
  }
}

服务器为每个请求设置一个带有 Lax 策略的 visits Cookie。这是用于会话跟踪和安全性的常见模式。

$ dart main.dart
Server running on InternetAddress('::1', 6):8080

最佳实践

来源

Dart SameSite 文档

本教程介绍了 Dart 的 SameSite 类,并提供了实际示例,展示了 Web 应用程序的 Cookie 安全配置。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程