5.8 Web安全基础
5.8.1 同源策略
定义与原理
同源策略(Same-Origin Policy)是一种重要的安全策略,用于限制从一个源(origin)加载的文档或脚本如何与来自另一个源的资源进行交互。这里的源由协议(如http或https)、域名(如www.example.com)和端口号(如80或443)三个部分组成。只有当这三个部分都相同时,才被认为是同源。
限制行为
- 如果两个源不同,则浏览器会阻止一些操作,如读取Cookie、LocalStorage和IndexDB等。
- 跨域请求通常受到同源策略的限制,但可以通过CORS(跨域资源共享)等方式来实现跨域访问。
示例
假设有一个网页位于https://www.example.com,它尝试通过AJAX请求访问https://api.example.org的资源。由于域名部分不同,这个请求会受到同源策略的限制,除非服务端支持CORS并设置了相应的响应头。
5.8.2 跨站脚本攻击(XSS)及其防御
定义与原理
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种通过利用网页开发时留下的漏洞,注入恶意脚本到用户浏览的页面中,从而在用户浏览器中执行恶意代码的攻击方式。XSS攻击的关键在于恶意代码未经过滤,与正常代码混在一起,导致浏览器无法分辨并执行。
类型
- 反射型XSS:攻击者将恶意代码包含在URL中,诱使用户点击链接,服务器将恶意代码反射回用户浏览器并执行。
- 存储型XSS:攻击者将恶意代码存储在服务器上(如数据库),当其他用户访问包含恶意代码的页面时,恶意代码会自动执行。
- DOM-based XSS :攻击者通过修改页面的DOM节点来执行恶意代码,这类攻击不依赖于服务器端的存储或反射。
防御措施 - 输入验证:对所有用户输入进行严格的验证和过滤,防止恶意代码注入。
- 输出编码:在输出到HTML页面时,对特殊字符进行编码,防止浏览器将其解释为HTML标签或JavaScript代码。
- 使用HttpOnly标志的Cookie:通过设置Cookie的HttpOnly属性,可以防止客户端脚本访问Cookie,从而减少XSS攻击的风险。
5.8.3 跨站请求伪造(CSRF)及其防御
定义与原理
跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是一种通过诱导用户在已登录的Web应用程序上执行非本意操作的攻击方式。攻击者利用用户的登录凭证(如Cookie),在用户不知情的情况下向服务器发送恶意请求。
攻击流程
- 用户登录受信任的网站A,并在本地生成了认证信息(如Cookie)。
- 攻击者诱导用户访问恶意网站B。
- 网站B向网站A发送一个跨站请求,浏览器会携带网站A的Cookie信息。
- 网站A接收到请求后,根据Cookie信息验证用户身份,并执行请求。
防御措施
- 验证码:在关键操作前要求用户输入验证码,增加攻击难度。
- Referer Check:检查请求的来源地址,确保请求来自合法的源。
- Token验证:为每个用户会话生成一个唯一的Token,并在请求中携带该Token。服务器验证Token的有效性,确保请求是用户本人发出的。
5.8.4 HTTPS
定义与原理
HTTPS(Hypertext Transfer Protocol Secure)是一种安全的网络传输协议,它通过在HTTP协议的基础上增加SSL/TLS加密层来确保数据传输的安全性。HTTPS可以保护用户数据不被窃听或篡改,并验证网站的身份。
特点
- 数据加密:使用SSL/TLS协议对数据进行加密传输,防止数据被窃听或篡改。
- 身份验证:通过数字证书验证服务器的身份,确保用户与正确的服务器进行通信。
- 完整性保护:使用MAC(消息认证码)来验证数据的完整性,确保数据在传输过程中未被篡改。
5.8.5 内容安全策略(CSP)
定义与原理
内容安全策略(Content Security Policy,简称CSP)是一种通过指定白名单来限制网站可以包含哪些来源的内容的安全机制。CSP可以减少XSS等攻击的风险,提高网站的安全性。
实现方式
- HTTP响应头 :通过
Content-Security-Policy响应头来设置CSP策略。 - HTML meta标签 :在HTML文档中使用
<meta>标签来设置CSP策略。
策略指令 - default-src :定义针对所有类型资源的默认策略。
- script-src:定义有效的脚本资源来源。这有助于防止XSS攻击,因为你可以限制哪些域可以加载JavaScript代码。
- object-src:定义可以加载的插件(如Flash)的有效来源。
- img-src:定义图像资源的有效来源。
- style-src:定义样式表(如CSS)的有效来源。
- connect-src:定义可以通过XHR、WebSocket或EventSource等技术连接到的有效来源。这有助于防止CSRF攻击,因为你可以限制哪些域可以通过这些技术进行通信。
- font-src:定义字体资源的有效来源。
- frame-src :定义可以通过
<frame>、<iframe>、<embed>或<object>标签加载的页面的有效来源。
示例
http
Content-Security-Policy: default-src 'self'; script-src 'self' https://trustedscripts.example.com; object-src 'none';
这个CSP策略指示浏览器:
- 仅允许从当前域(
'self')加载资源,作为默认行为。 - 仅允许从当前域和
https://trustedscripts.example.com加载脚本。 - 不允许加载任何插件(
object-src 'none')。
优势 - 减少XSS攻击的风险:通过限制可以加载和执行脚本的域,可以减少XSS攻击的成功率。
- 减少数据泄露的风险:通过限制可以加载的资源类型,可以减少敏感数据被非法获取的风险。
- 提高网站性能:通过减少不必要的资源加载,可以提高网站的加载速度和性能。
注意
- CSP策略应该谨慎设置,以避免误拦截合法资源。
- CSP策略需要所有相关方(包括第三方服务提供者)的配合才能有效实施。