0

我需要修复 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。但我不知道如何实施解决方案。请提出解决方案。

4

3 回答 3

0

回答——使用 ESAPI 的代码如下。xml.append(ESAPI.encoder().encodeForXML(desc)); 它将转义变量“desc”中的数据。通过实现这一点,变量 'desc' 中的内容将被读取为数据不可执行代码,因此数据不会在浏览器中根据后端 java 代码的响应执行。

于 2012-06-18T13:09:51.970 回答
0

据我了解:

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

在这里,您从外部来源获得了一些数据。然后你必须验证这些数据。否则任何人都可以将任何数据放在那里,这会导致客户端的破坏(例如cookies会被盗)。

于 2012-06-13T06:38:49.393 回答
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 序列化程序,但有很多可用的替代方法。)

于 2012-06-13T08:25:44.370 回答