XSS VULNERABILITY FOR XML -- response.getWriter().write(xml.



我需要修复 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 代码的响应中在浏览器中执行。

最新更新