【问题标题】:JavaScript variable in JSP expression tagsJSP 表达式标签中的 JavaScript 变量
【发布时间】:2020-04-07 03:52:06
【问题描述】:

我有这个 JavaScript 代码:

<script>
    function greetings() {
        var hash = window.location.hash.substring(1);
        if (hash != "") {
            var name = "<%= Encode.forJavaScriptBlock(hash) %>";
            document.write("<h1> Hello " + name + "!</h1>");    
        }
        else {
            document.write("<h1>Welcome Back!</h1>");       
        }
    }
    greetings();
</script>

当我运行它时,我收到以下与 name 变量的声明行相关的错误:

哈希无法解析为变量

我不明白为什么哈希变量似乎在我的范围内。

【问题讨论】:

标签: javascript java jsp variables


【解决方案1】:

您似乎对 Java 和 JavaScript 代码的执行时间有一些误解。

JSP 中的代码被编译成如下所示的 Java 代码:

out.println("<script>");
out.println("    function greetings() {");
out.println("        var hash = window.location.hash.substring(1);");
out.println("        if (hash != \"\") {");
out.print("            var name = \"");
out.print(Encode.forJavaScriptBlock(hash));
out.println("\";");
out.println("            document.write(\"<h1> Hello \" + name + \"!</h1>\");");
out.println("        }");
out.println("        else {");
out.println("            document.write(\"<h1>Welcome Back!</h1>\");");
out.println("        }");
out.println("    }");
out.println("    greetings();");
out.println("</script>");

服务器不处理 &lt;script&gt; 元素中的 JavaScript 代码。对于服务器来说,这只是它直接发送到浏览器的文本负载,没有任何进一步的处理。但是,在您的 JSP 中,您有一个 scriptlet &lt;%= Encode.forJavaScriptBlock(hash) %&gt;,它的内容确实会写入已编译的 Java 代码中。这一行试图引用一个名为hash 的Java 变量,但没有这样的东西:虽然您的JavaScript 代码确实包含一个名为hash 的变量,但(a) 永远不会存在于运行JSP 的服务器上, (b) 在页面被发送到浏览器之前,用户的浏览器中不会存在,这将是在 JSP 完成运行之后。

这就是您遇到错误的原因。

最终,您似乎正试图防止恶意数据被插入到您的网页中,但并不十分了解如何做到这一点。看起来你最好遵循你链接到的备忘单中的规则#6,在你的页面某处有一个&lt;h1&gt;元素,带有一个ID,并修改你的JavaScript函数来改变它的文本内容,即

<h1 id="greeting-message">

<script>
    function greetings() {
        var hash = window.location.hash.substring(1);
        var greetingElement = document.getElementById("greeting-message");
        if (hash != "") {
            greetingElement.textContent = "Hello " + hash + "!";
        }
        else {
            greetingElement.textContent = "Welcome Back!";
        }
    }
    greetings();
</script>

【讨论】:

  • 感谢您的回答和解决方案。我不明白的是,在这个链接cheatsheetseries.owasp.org/cheatsheets/… 上,这似乎像我想要的那样使用,至少在提供的示例中。我完全理解你在说什么,但我不明白 OWASP 的例子是如何工作的。我不想使用 .textContent,我只想使用提供的库。您能否发布一个使用它的示例?非常感谢您。
  • @ibrahim87:OWASP 库旨在与服务器上的数据一起使用。这通常是从数据库中读取的数据。您的示例使用 URL 的哈希,在这里没有用,因为浏览器不会将哈希发送到服务器(请参阅this question)。您是否可以尝试使用查询字符串参数,而不是使用哈希?为此,请将 URL 中的 #someone 替换为 ?user=someone,并在 JSP 中使用 request.getParameter("user") 以获取值 someone
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多