设置SameSite:Strict后Cookie仍被跨站发送的问题求助
我尝试给Cookie设置SameSite:Strict属性,但完全不起作用。
Server1(运行于 http://localhost:5000/)
const express = require('express'); const cookieParser = require('cookie-parser'); var logger = require("morgan"); const app = express(); app.use(cookieParser()); app.use(logger("dev")); app.get('/', (req, res) => { res.cookie('mycookie', 'omarhadidi', { sameSite: 'strict' }); res.sendFile('./server.html', {root:__dirname}) }) app.post('/delete-user', (req, res) => { console.log('cookies :>> ', req.cookies); res.send('I am hacked') }) app.listen(5000, () => console.log("Server Listening on port 5000"));
Server2(通过VSCode LiveServer运行于 http://localhost:3000/hack.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p id="data"></p> <form action="http://localhost:5000/delete-user" method="post"> <input type="submit" value="Hack"> </form> <script> console.log('cookies :>> ', document.cookie); const form = document.querySelector("form") // form.submit(); I cancelled Here to try to submit it manually using submit button </script> </body> </html>
问题描述
当我向http://localhost:5000/发送GET请求时,mycookie被成功设置,但当我通过http://localhost:3000/hack.html中的表单向http://localhost:5000/delete-user发送POST请求时,该Cookie仍被发送(Server1中通过console.log('cookies :>> ', req.cookies);打印出了该Cookie)。
原因及解决方案
核心原因
浏览器判断跨站的标准基于协议+主域名/子域名,端口不属于域名判定的一部分。你的两个服务都运行在localhost下,浏览器会认为它们属于同一站点,因此即使设置了SameSite:Strict,依然会携带Cookie。
解决方法
使用不同域名测试跨站场景
修改本地hosts文件(Windows路径:C:\Windows\System32\drivers\etc\hosts;Mac/Linux路径:/etc/hosts),添加两条映射:127.0.0.1 site1.test 127.0.0.1 site2.test然后将Server1绑定到
site1.test:5000,Server2绑定到site2.test:3000,此时两个站点属于不同域名,SameSite:Strict会阻止跨站请求携带Cookie。确认Express版本兼容性
旧版本Express可能对SameSite属性支持存在问题,建议升级到最新稳定版:npm update express cookie-parser补充说明
SameSite:Strict的核心作用是阻止跨站点请求伪造(CSRF),仅当请求发起方站点与Cookie所属站点完全一致时,才会携带Cookie。端口差异不触发跨站判定,这是浏览器的标准行为。
内容的提问来源于stack exchange,提问作者Omar AlHadidi

