首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Servlet中编写HTTP响应时存在跨站点脚本缺陷(下载excel文件)

在Servlet中编写HTTP响应时存在跨站点脚本缺陷(下载excel文件)
EN

Stack Overflow用户
提问于 2019-07-25 13:17:29
回答 1查看 2K关注 0票数 0

以下代码容易出现veracode扫描报告的跨站点脚本攻击:

代码语言:javascript
复制
public void doPost(HttpServletRequest request,HttpServletResponse response)
    {

        byte[] inputBytes = request.getParameter("input").getBytes();
        String name = request.getParameter("filename") == null?"excelReport":request.getParameter("filename").toString();
        response.setContentType("application/vnd.ms-excel");
        response.setContentLength(inputBytes.length);
        response.addHeader("content-disposition", "attachment; filename="+name+".xls");
        try {
            response.getOutputStream().write(inputBytes, 0, inputBytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

我理解代码行- response.getOutputStream().write(inputBytes, 0, inputBytes.length);很容易受到XSS攻击。

如何在这里修复XSS(跨站点脚本)缺陷?是否有任何ESAPI库可以用于byte[]数组来修复XSS缺陷?

EN

回答 1

Stack Overflow用户

发布于 2019-07-29 20:06:50

有两件事需要发生,好的防御深入的方法来防止XSS.

  1. 输出编码
  2. 输入验证

您的代码存在一些安全问题,而不仅仅是XSS。但是为了完成你的主要问题,OWASP的ESAPI有一个编码器,还有ESAPI编码器项目。正确的方法是在将编码器交给解释器时使用它。由于您使用的是JSP,因此您需要对显示给用户的任何输出进行编码,以确保用户的安全。

你的其他问题:

代码语言:javascript
复制
public void doPost(HttpServletRequest request,HttpServletResponse response)
    {
        //Did we get the correct file?  
        byte[] inputBytes = request.getParameter("input").getBytes();
        //Validation against legal characters in the filename?
        String name = request.getParameter("filename") == null?"excelReport":request.getParameter("filename").toString();
        response.setContentType("application/vnd.ms-excel");
        response.setContentLength(inputBytes.length);
        //This is the line that's immediately triggering your problem.  The attacker controls that filename and you've done nothing to check it!  
        //If you encoded here you MIGHT be fine!  
        response.addHeader("content-disposition", "attachment; filename="+name+".xls");
        try {
            response.getOutputStream().write(inputBytes, 0, inputBytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

如果您想要了解此漏洞,请使用像OWASP的ZAP这样的工具,并将文件名参数修改为类似于<script>alert(1);</script>的值,您将看到该漏洞正在执行中。

至于文件本身,ESAPI只提供了检查文件扩展名白名单的方法,它不是很好,但文件验证实际上是相当困难的。因此,不存在验证文件字节的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57202881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档