我需要修复 xss 漏洞的问题。 代码段如下。
StringBuffer xml = new StringBuffer();
xml.append("<?xml version="1.0"?>");
xml.append("<parent>");
xml.append("<child>");
for(int cntr=0; cntr < dataList.size(); cntr++){
AAAAA obj = (AAAAA) dataList.get(cntr);
if(obj.getStatus().equals(Constants.ACTIVE)){
xml.append("<accountNumber>");
xml.append(obj.getAccountNumber());
xml.append("</accountNumber>");
xml.append("<partnerName>");
xml.append(obj.getPartnerName());
xml.append("</partnerName>");
xml.append("<accountType>");
xml.append(obj.getAccountType());
xml.append("</accountType>");
xml.append("<priority>");
xml.append(obj.getPriority());
xml.append("</priority>");
}
}
xml.append("</child>");
xml.append("</parent>");
response.getWriter().write(xml.toString());
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
问题出在具有语法响应的行.getWriter().write(xml.toString());它说它容易受到xss攻击。我已经做了足够的家庭作业,并安装了ESAPI 2.0。但我不知道如何实施解决方案。请提出解决方案。
您应该始终转义插入到 XML 文档中的任何文本和属性节点,因此我希望看到
xml.append("<accountType>");
xml.append(escape(obj.getAccountType()));
xml.append("</accountType>");
其中 escape() 负责需要特殊处理的字符,例如。"<"、"&"、"]]>"和代理项对。
更好的是,不要通过字符串连接来构造 XML。使用允许您编写的序列化库
out.startElement("accountType");
out.text(obj.getAccountType());
out.endElement();
(当我需要这样做时,我使用带有StAX XMLStreamWriter接口的Saxon序列化程序,但有很多替代方案可用。
据我了解:
AAAAA obj = (AAAAA) dataList.get(cntr);
在这里,您可以从外部来源获得一些数据。然后,您必须验证这些数据。否则,任何人都可以将任何数据放在那里,这将导致客户端的破坏(例如,cookie将被窃取)。
ANSWER-- 下面有使用 ESAPI 的代码。xml.append(ESAPI.encoder().encodeForXML(desc));它将转义变量 'desc' 中的数据。通过实现这一点,变量 'desc' 中的内容将被读取为数据而不是可执行代码,因此数据不会在后端 java 代码的响应中在浏览器中执行。