7-15

XSS 防御方法

1. 对用户输入进行严格的过滤和验证

永远不要信任用户的任何输入

  • 白名单过滤:只允许输入符合预定规则的字符。比如,如果一个输入框只用于输入姓名,那么只允许汉字、字母和空格通过
  • 黑名单过滤:过滤掉危险的HTML标签和属性,如 <script><iframe><img>onerror 属性等。然而,这种方法容易被绕过,不推荐作为主要的防御手段。攻击者可以通过大小写混合、特殊编码或利用不常见的HTML标签来绕过黑名单

2. 对输出进行编码(转义)

这是防御 XSS 最有效、最关键的方法。当动态内容被渲染到页面时,必须对其中的特殊字符进行转义,使其失去代码的含义,而只作为纯文本显示

  • HTML实体编码:将一些HTML特殊字符转换成HTML实体,例如:
    • < 转换为 &lt;
    • > 转换为 &gt;
    • " 转换为 &quot;
    • ' 转换为 &#39;
  • 不同上下文的编码:转义需要根据输出的上下文来选择不同的编码方式。
    • 在HTML元素中:使用 HTML 实体编码
    • 在JavaScript代码中:使用 JavaScript 转义,将特殊字符转成 uXXXX 的形式
    • 在URL参数中:使用 URL 编码,将特殊字符转成 %XX 的形式