我如何编写一个打开 JSbox 的 Jsp 页面。
适用于此的主要漏洞,例如。
我只是担心 HTML 和 JS 注入引起的跨站点脚本问题。CSRF 似乎还不是问题,因为只是提醒“你好”并没有任何您必须登录才能执行的主动副作用。
愚蠢的做法:
<script type="text/javascript">
alert('Hello, <%= request.getParameter("name") %>');
</script>
这会受到 JS 注入的影响,因为 JS 字符串文字中没有 JS 转义:
name=');execute_arbitrary_code();'
并且还遭受 HTML 注入,因为封闭的脚本块可以提前关闭:
name=</script><script>execute_arbitrary_code();//
不幸的是,JSP 中没有标准标记可以转义 JS 字符串文字中的文本(它本身在 HTML 脚本块中)。您可以编写并使用您自己的标签来执行此操作,或者重用定义了标签的库。例如 OWASP ESAPI 有:
<script type="text/javascript">
alert('Hello, <esapi:encodeForJavaScript>${param.name}</esapi:encodeForJavaScript>');
</script>
但通常更容易避免编码为 JS,而是通过 DOM 推送数据。因为 DOM 是纯 HTML,所以您只需要正常的标记转义,JSP 本身就在<c:out>
标记中。
<input type="hidden" id="name-parameter" value="<c:out value="${param.name}"/>"/>
<script type="text/javascript">
var name = document.getElementById('name-parameter').value;
alert('Hello, '+name);
</script>
这有助于实现将 JS 与标记和服务器端代码分开的长期目标。data-
属性是将数据从标记传递到 JS 的另一种好方法。