1

我有点苦恼:

我有很多值,我在 java 的 bean 中设置,然后我使用这样的脚本在 javascript 和 jsp 中获取它们:

在我的 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中获取编码字符串然后解码它?

4

1 回答 1

2

听起来您的安全人员担心 XSS(跨站点脚本)攻击,这意味着用户输入的重新显示在页面上的数据可能包含恶意代码。如果是这种情况,您实际上不想对数据进行 URL 编码,您希望 XML 对其进行转义,即将具有潜在危险的字符替换<为相应的字符实体,例如&lt;. 要在 JSP 中执行此操作,您可以使用<c:out>标记或fn:escapeXMLEL 函数。这在 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 在类路径中,并确保在页面顶部包含正确的标签库。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
于 2013-05-02T13:34:56.673 回答