# 安全
# 同源
- 协议 http https
- 域名
- 端口
# XSS
恶意注入脚本
- 存储型:通过提交存在数据库,等回显时触发
- 反射型:和存储型类似,只是不存在数据库中
- 拦截网络
解决:
- 服务器对输入脚本进行过滤或转码
- 充分利用 CSP (opens new window): 头部资源白名单
- 使用 HttpOnly 属性:确保 cookie 不被客户端访问
# CSRF
不注入代码,冒用 cookie 来操作请求
解决:
- 充分利用好 Cookie 的 SameSite 属性
- CSRF Token
# CORS (跨域资源共享) (opens new window)
# 浏览器的同源策略
Origin 字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)
实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信
# 一个跨域的简单请求 (opens new window)
服务器可以接收到请求,会被浏览器同源策略拦截
满足简单请求的四个条件
服务端的跨域设置:
Access-Control-Allow-Origin:*
// 如果只是针对某一个请求源进行设置的话,可以设置为具体的值
Access-Control-Allow-Origin: 'http://www.yourwebsite.com'
# 一个跨域的复杂请求
会先发送一个 options 预检请求,通过后才会发送真正的请求。
服务端的跨域设置:将 OPTIONS 放行
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
// 设置max age,浏览器端会进行缓存。没有过期之前真对同一个请求只会发送一次预检请求
Access-Control-Max-Age: 86400
如果需要 cookie,客户端设置 withCredentials:true,服务端设置:Access-Control-Allow-Credentials: true,Access-Control-Allow-Origin 需要设置为请求源
# HTTPS
# cookie
- HttpOnly 确保 cookie 不被客户端访问
- Secure 确保资源是 https 的
- SameSite 确保 URL 一致