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

时间:2012-06-13 06:24:58

标签: java xml xss

我需要修复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");

问题在于具有语法response.getWriter()。write(xml.toString());它说它很容易受到xss攻击。我做了足够的家庭工作,还安装了ESAPI 2.0。但我不知道如何实施解决方案。 请提出解决方案。

3 个答案:

答案 0 :(得分:0)

我能理解:

AAAAA obj = (AAAAA) dataList.get(cntr);

这里有来自外部来源的一些数据。 然后你必须验证这些数据。否则任何人都可以在那里放置任何数据,这会导致客户端的破坏(例如,cookie会被破坏)。

答案 1 :(得分:0)

您应该始终将您插入的任何文本和属性节点转义为XML文档,因此我希望看到

xml.append("<accountType>");
xml.append(escape(obj.getAccountType()));
xml.append("</accountType>");

其中escape()查找需要特殊处理的字符,例如: “&lt;”,“&amp;”,“]]&gt;”和代理人对。

更好的是,不要通过字符串连接来构造XML。使用允许您编写的序列化库

out.startElement("accountType");
out.text(obj.getAccountType());
out.endElement();

(当我需要这个时,我使用带有StAX XMLStreamWriter接口的Saxon序列化程序,但是有很多替代方法可供使用。)

答案 2 :(得分:0)

答案 - 使用ESAPI的代码如下。 xml.append(ESAPI.encoder()encodeForXML(降序)。); 它将转义变量'desc'中的数据。通过执行此操作,变量'desc'中的内容将被重新作为数据而不是可执行代码,因此在后端java代码的响应中,数据将不会在浏览器中执行。