版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接。 https://blog.csdn.net/axing2015/article/details/89152166
控制java后端返回前端<script>callback(alert("a"))</script>
是否弹出提示框
今天收到安全部门反馈的一个问题,现象是这样的:
通过文件导入名单,并回显到前台输入框,再回显之后,浏览器会弹出一个alert提示框。
文件内容是:abc’);alert(/cbd/);//
回显到输入框:abc
弹出框是:cbd
jsp前端代码
<s:form method="post" action="http://localhost:8800/cms/name.do" enctype="multipart/form-data">
<s:file name="file" theme="simple"/>
<input type="submit" value="提交"/>
</s:form>
<input type="text" id="memberId"/>
<script>
function callback(param){
document.getElementById("memberId").value = param;
}
</script>
java后端代码
private File file;
BufferedReader br = new BufferedReader(new ImputStreamReader(new FileImputStream(file),"UTF-8"));
...省略一些读取文件内容代码
String msg = br.readLine();
// 获取 javax.servlet.http.HttpServletResponse 不做多的介绍
// 设置 header、encoding、contentType
response.setHeader("Charset", "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
// 获取 PrintWriter
PrintWriter writer = reponse.getWriter();
// 直接写到前端
writer.writr(<script>callback(msg)</script>);
writer.close();
通过上面的代码可知问题是出在上传文件中包含了alert(/cbd/);
内容,在后端读取之后,直接返回到了前端,前端则直接执行了alert弹出了提示框。
解决该问题需要通过org.apache.commons.lang.StringEscapeUtils.escapeJavaScript(msg)
工具对读取文件内容进行转义,这样到前台只会当成字符串输出。
StringEscapeUtils
里面有很多工具方法,有兴趣的可以研究一下。