在 Java Rest API 响应上持久强化跨站点脚本(JSON 字符串和 XML 字符串)

Fortify Cross-Site Scripting Persistent on Java Rest API response (JSON string & XML string)

我知道要修复跨站点脚本,我需要验证用户输入并对输出进行编码以避免浏览器执行恶意数据。

但是我的应用程序只是一个纯 Rest API 其中 return JSON 字符串和 XML 字符串,fortify 报告跨站点脚本持久(存储)因为代码将从 db 和 return 查询数据到 response

#Java Code
@PostMapping(path = "${api.abc.endpoint}")
public ResponseEntity processRequest(@RequestBody String requestStr,
  HttpServletRequest servletRequest) {

    ResponseEntity<String> response = null;
    String responseStr = "";
    responseStr = processRequest(requestString, servletRequest);

    response = ResponseEntity.ok().body(responseStr);

    return response; //response can be JSON or XML
}

#Original JSON Response
{
  "type":"order",
  "responseCode":"001",
  "responseText":"Success",
  "transDesc":"Value from DB"
}

#Original XML Response
<abc:res xmlns:abc="http://sample.com/abc/">
   <type>order</type>
   <responseCode>001</responseCode>
   <responseText>Success</responseText>
   <transDesc>Value from DB</transDesc>
</abc:res>

我尝试使用 OWASP Java 编码器对输出字符串进行编码,我得到了下面的编码字符串,它改变了响应格式。

#Encoded JSON Response
{\"type\":\"order\",\"responseCode\":\"001\",\"responseText\":\"Success\",\"transDesc\":\"Value from DB\"}


#Encoded XML Response

<data contentType="application/xml;charset=UTF-8" contentLength="241">
<![CDATA[&lt;abc:res xmlns:abc="http://sample.com/abc/"&gt;&lt;type&gt;order&lt;/type&gt;&lt;responseCode&gt;001&lt;/responseCode&gt;&lt;responseText&gt;Success&lt;/responseText&gt;&lt;transDesc&gt;Value from DB&lt;/type&gt;&lt;/abc:res&gt;]]></data>

我怎样才能真正修复 JSON 字符串和 XML 字符串在 fortify 中持久存在的跨站点脚本?

谢谢。

Fortify 可能太急于检测 XSS,因为它假定您生成的任何数据最终都可能被直接解释为 HTML。不过,使用 XML 或 JSON 内容类型发送回浏览器的内容本身不易受到 XSS 攻击。检查发回的 content-type header 不是 text/html.

问题可能是客户端会读取部分响应并将其按原样输出到页面上。这里的编码将是客户的责任,尽管使用哪种编码取决于输出上下文。

许多 client-side 框架将 HTML 默认情况下根据需要对数据进行编码。如果您控制客户端,您应该检查它是否在此处进行自己的编码。

输入验证通常也有帮助。在此处或在写入数据库的相关请求中。可以根据输入的内容验证输入。