在 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[<abc:res xmlns:abc="http://sample.com/abc/"><type>order</type><responseCode>001</responseCode><responseText>Success</responseText><transDesc>Value from DB</type></abc:res>]]></data>
我怎样才能真正修复 JSON 字符串和 XML 字符串在 fortify 中持久存在的跨站点脚本?
谢谢。
Fortify 可能太急于检测 XSS,因为它假定您生成的任何数据最终都可能被直接解释为 HTML。不过,使用 XML 或 JSON 内容类型发送回浏览器的内容本身不易受到 XSS 攻击。检查发回的 content-type header 不是 text/html
.
问题可能是客户端会读取部分响应并将其按原样输出到页面上。这里的编码将是客户的责任,尽管使用哪种编码取决于输出上下文。
许多 client-side 框架将 HTML 默认情况下根据需要对数据进行编码。如果您控制客户端,您应该检查它是否在此处进行自己的编码。
输入验证通常也有帮助。在此处或在写入数据库的相关请求中。可以根据输入的内容验证输入。
我知道要修复跨站点脚本,我需要验证用户输入并对输出进行编码以避免浏览器执行恶意数据。
但是我的应用程序只是一个纯 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[<abc:res xmlns:abc="http://sample.com/abc/"><type>order</type><responseCode>001</responseCode><responseText>Success</responseText><transDesc>Value from DB</type></abc:res>]]></data>
我怎样才能真正修复 JSON 字符串和 XML 字符串在 fortify 中持久存在的跨站点脚本?
谢谢。
Fortify 可能太急于检测 XSS,因为它假定您生成的任何数据最终都可能被直接解释为 HTML。不过,使用 XML 或 JSON 内容类型发送回浏览器的内容本身不易受到 XSS 攻击。检查发回的 content-type header 不是 text/html
.
问题可能是客户端会读取部分响应并将其按原样输出到页面上。这里的编码将是客户的责任,尽管使用哪种编码取决于输出上下文。
许多 client-side 框架将 HTML 默认情况下根据需要对数据进行编码。如果您控制客户端,您应该检查它是否在此处进行自己的编码。
输入验证通常也有帮助。在此处或在写入数据库的相关请求中。可以根据输入的内容验证输入。