什么是CSRF攻击?

CSRF(Cross-Site Request Forgery,跨站请求伪造) 是一种通过伪造用户的身份向服务器发送恶意请求的攻击方式。攻击者利用用户在目标网站上的已登录状态,强制用户在不知情的情况下执行非自愿的操作。

CSRF攻击的原理:

  1. 用户登录了可信网站A,并在浏览器中保留了登录凭证(如Cookie)。
  2. 用户访问了攻击者的网站B,攻击者在这个网站中嵌入了恶意代码。
  3. 恶意代码以用户身份向网站A发送请求(如转账、修改数据等),并自动携带用户的登录凭证。
  4. 网站A接收到请求后,误以为是用户自己发起的,执行了请求。

CSRF攻击的危害:

  • 强制用户转账或支付操作。
  • 更改用户账户设置(如邮箱或密码)。
  • 在后台执行管理操作,如删除数据或创建用户。

如何防止防止CSRF攻击?

  1. CSRF Token:
    在表单提交时生成随机的唯一Token,服务器校验Token的合法性。
    示例:在请求中附加Token字段:
<input type="hidden" name="csrf_token" value="随机生成的Token">
  1. Referer验证:
    检查HTTP请求头的Referer字段,确保请求来源于可信站点。
  2. SameSite Cookie:
    设置Cookie的SameSite属性,限制Cookie在跨站请求中发送:
Set-Cookie: key=value; SameSite=Strict
  1. 关键操作需要二次验证:
    在敏感操作(如转账)中要求用户重新输入密码或验证码。

什么是XSS攻击?

XSS(Cross-Site Scripting,跨站脚本攻击) 是通过在网页中注入恶意脚本(JavaScript)的方式,使脚本在其他用户的浏览器中执行,窃取信息或进行恶意操作。

XSS攻击的分类:

  1. 存储型XSS:
    恶意脚本被永久存储在服务器端(如数据库),当其他用户访问相关页面时,脚本被执行。
    例子:在评论区提交恶意脚本。
  2. 反射型XSS:
    恶意脚本通过URL参数传递,当用户访问该URL时,脚本在响应中被反射并执行。
    例子:访问一个恶意链接:
https://example.com/search?q=<script>alert('XSS')</script>
  1. DOM型XSS:
    直接在浏览器端通过修改DOM节点执行恶意脚本,与服务器无关。

XSS攻击的危害:

  • 窃取用户Cookie或会话信息。
  • 执行恶意重定向,劫持用户流量。
  • 模拟用户操作(如伪造支付页面)。

如何防止防止XSS攻击?

  1. 输入验证与清理:
    • 对用户输入进行严格验证,过滤掉特殊字符(如<, >, ', ")。
    • 例如,转义HTML标签:
< -> &lt;
> -> &gt;
' -> &#39;
" -> &quot;
  1. 输出编码:
    • 在HTML或JavaScript输出用户输入内容时,对内容进行编码,避免被解析为脚本。
    • 使用专门的编码库,如OWASP ESAPI
  2. Content Security Policy(CSP):
    • 限制页面中可以执行的脚本来源:
Content-Security-Policy: script-src 'self' https://trusted.cdn.com;
  1. 避免直接拼接用户输入:
    • 不要将用户输入直接插入HTML或JavaScript中,使用模板引擎的安全API。
  2. HttpOnly Cookie:
    • 设置Cookie的HttpOnly属性,防止JavaScript访问Cookie:
Set-Cookie: sessionId=abc123; HttpOnly

CSRF与XSS的区别

维度CSRFXSS
攻击目标用户身份和操作其他用户和数据
依赖条件用户已登录并保持会话状态目标网站存在脚本注入漏洞
攻击方式利用受害者的身份向网站发送恶意请求在目标网站注入并执行恶意脚本
防护手段CSRF Token、Referer验证、SameSite Cookie等输入验证、输出编码、CSP、防止脚本注入等

总结:

  • CSRF主要利用用户的身份发起未授权请求。
  • XSS则是注入脚本,操控其他用户的浏览器行为。
    两者可以结合使用,攻击者可能利用XSS窃取用户的身份凭证(如Cookie),然后发起CSRF攻击。全面的安全措施能更好地防范这两种攻击。