安全漏洞:如何避免它们?

时间:2013-05-02 08:46:48

标签: java javascript security jsp jstl

我有点腌菜:

我有很多值,我在java中设置一个bean,然后我使用scriplets在javascript和jsp中获取它们:

在My Bean.java中:

public void setListValue(String s) {   listValue = s;    }
public String getListValue()       {   return listValue;     } 

现在在我的jsp中(在javascript函数中):

input = $input({type:'hidden',id:'ListVal',name:'ListVal',
value: '<%= results.getListValue() %>'});

有时我也会使用scriplet代码来检索jsp中的参数。

通常,如果参数从java文件传递到java文件或从jsp文件传递到jsp文件,那么我使用本机java编码器和解码器,如下所示:

     EncodedHere = URLEncoder.encode(encodedStr,"UTF-8");
     DecodedHere = URLDecoder.decode(EncodedHere,"UTF-8");

这对于那些场景完美无缺,但是如果我在java中设置我的变量然后我尝试在javascript或jsp中检索它们,就像前面提到的那样,它就失败了。我也尝试过 JSTL 方式,但无法使其工作,似乎JSTL不适合在javascript中获取值。现在这个文章被许多人标记为安全问题。由于它是一个巨大的代码库,因此很难改变它。

是否有人有任何想法以某种方式避免这种安全漏洞。换句话说,有没有办法可以在java中编码变量并在jsp和javascript中获取编码的字符串,然后对其进行解码?

1 个答案:

答案 0 :(得分:2)

听起来您的安全人员担心XSS(跨站点脚本)攻击,这意味着用户输入的重新显示在页面上的数据可能包含恶意代码。如果是这种情况,您实际上不希望对数据进行URL编码,那么您希望XML将其转义,即将<等潜在危险字符替换为与&lt;相对应的字符实体。要在JSP中执行此操作,您可以使用<c:out>标记或fn:escapeXML EL函数。这在javascript代码中运行得非常好,即使它有点难看。在你的情况下,它看起来像这样:

首先使用转义库将ESAPI参考实现放在请求之前转义javascript:

String jsEscapedValue = ESAPI.encoder().encodeForJavaScript(results.getListValue());
request.setAttribute("listValue", jsEscapedValue);

然后在页面上使用<c:out>标记转换为HTML / XML:

var myJsValue = '<c:out value="${listValue}"/>';

确保jstl.jar位于类路径上,并确保在页面顶部包含正确的标记lib。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>