Dart SameSite
最后修改于 2025 年 4 月 4 日
Dart 中的 SameSite 类为 Cookie 提供了安全属性。它通过控制 Cookie 的行为来帮助防止跨站请求伪造 (CSRF) 攻击。
SameSite 是 Dart dart:io 库的一部分,并与 Cookie 类一起使用。它为 Cookie 定义了三种安全级别。
基本定义
SameSite 是一个枚举,用于指定 Cookie 安全策略。它决定了 Cookie 何时会随跨站请求一起发送。
这三个值是 Lax、Strict 和 None。每个值都为 Cookie 传输提供了不同的安全级别。
SameSite.Lax 示例
本示例展示了如何设置具有 Lax 安全策略的 Cookie。
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 策略。
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。
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 配置。
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。
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
最佳实践
- 默认 Lax: 在不破坏功能的情况下提供良好的安全性
- 使用 Strict: 适用于高度敏感的操作,如银行业务
- None 要求 Secure: 始终对 SameSite=None 使用 HTTPS
- 彻底测试: SameSite 的更改可能会影响跨站功能
来源
本教程介绍了 Dart 的 SameSite 类,并提供了实际示例,展示了 Web 应用程序的 Cookie 安全配置。
作者
列出 所有 Dart 教程。