我有点腌菜:
我有很多值,我在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中获取编码的字符串,然后对其进行解码?
答案 0 :(得分:2)
听起来您的安全人员担心XSS(跨站点脚本)攻击,这意味着用户输入的重新显示在页面上的数据可能包含恶意代码。如果是这种情况,您实际上不希望对数据进行URL编码,那么您希望XML将其转义,即将<
等潜在危险字符替换为与<
相对应的字符实体。要在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"%>