CS.XSS.REFLECT

跨站脚本反射型漏洞

CS.XSS.REFLECT 检查会标记代码的实例,其中输入直接由来自 HTTP 请求的数据提供,然后反映/显示给用户,并由 Web 浏览器执行。

漏洞与风险

遭到跨站脚本 (XSS) 攻击后,对于用户可控制的输入,软件不会或会错误地对其进行中性化处理,随后便将其放入用于服务其他用户的网页的输出中。

发生 XSS 漏洞时:

  1. 不受信任的数据会进入 Web 应用程序,通常是通过 Web 请求。
  2. 该 Web 应用程序会动态生成一个包含此不受信任数据的网页。
  3. 在页面生成期间,应用程序不会阻止数据包含可由 Web 浏览器执行的内容,如 JavaScript、HTML 标签、HTML 属性、鼠标事件、Flash、ActiveX 等。
  4. 通过使用 Web 浏览器,受害者会访问生成的网页,而网页中则包含使用不受信任数据注入的恶意脚本。
  5. 因为脚本来自由 Web 服务器发送的网页,所以受害者的 Web 浏览器会在 Web 服务器域的上下文中执行恶意脚本。
  6. 这可以有效避开 Web 浏览器的同源策略,该策略规定,一个域中的脚本不可访问其他域中的资源或在其中运行代码。

XSS 有三个主要类型:

  • 类型 1:反射型 XSS(或非持久型)
  • 类型 2:存储型 XSS(或持久型)
  • 类型 0:DOM 型 XSS

服务器直接从 HTTP 请求读取数据,并将其重新传递给 HTTP 响应。攻击者成功发起反射型 XSS 攻击时,会致使受害者向易受攻击的 Web 应用程序提供危险内容,然后该内容会重新传递给受害者并由 Web 浏览器执行。提供恶意内容的最常见机制,是将其作为参数包含在公开发布或通过电子邮件直接发送给受害者的 URL 中。以这种方式构建的 URL 是许多网络钓鱼方案的核心,因此攻击者会说服受害者访问指向易受攻击站点的 URL。在网站将攻击者的内容重新传递给受害者后,该内容将由受害者的浏览器执行。

缓解与预防

为防止 XSS 攻击,请先对所有用户可控制的输入进行中性化处理,然后再将这些数据放入用作网页的输出中。

漏洞代码示例

复制
  protected void Page_Load(object sender, EventArgs e)
  {
      string reqStr = Request.QueryString["id"];
      MyLabel.Text = "From get string: " +   reqStr;       // CS.XSS.REFLECT
  }

在此示例中,Klocwork 在第 4 行报告了缺陷,这表示“在第 3 行从 get_QueryString() 接收到未经验证的 XSS 字符串 reqStr。该内容会通过调用第 4 行的 get_Text() 写入 stdout。这可能造成跨站脚本漏洞。

修正代码示例

复制
  protected void Page_Load(object sender, EventArgs e)
  {
      string reqStr = Request.QueryString["id"];
      MySafeLabel.Text = "From get string: " + Server.HtmlEncode( reqStr );  // no defect as Server.HtmlEncode() sanitizes the data
  }

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。