为什么 javascript 不在这里显示警报?

why does javascript not show an alert here?

我正在尝试从 Portswigger 学习 XSS,在它的实验室中 https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-double-quotes-encoded-single-quotes-escaped,我的方法产生了以下 javascript 代码。

<script>
  var searchTerms = '\';
  alert(1);
  \'';
</script>

问题是这段代码向我显示了一个错误。但是既然Javascript是解释型语言,不是应该先显示alert再显示error吗?

<script>
  var searchTerms = '\';
  alert(1);
  whatever;
</script>

就像上面的代码片段一样,也是错误的。在这里我也得到一个错误,但也显示了警报。那么为什么不是第一种情况呢?

您在第一个代码中生成的是 Syntax Error。这些错误发生在 JavaScript 引擎解析脚本并遇到语法无效代码时。如果 JavaScript 文件包含语法错误,将执行文件中的 none 代码。

在你的第二个代码中,你没有语法错误,而是语义错误,这就是为什么你的第二个脚本会显示警报。

脚本未按预期运行的原因是您假设 javascript 只会查看一行,执行它,然后继续下一行。

然而,javascript实际上事先查看了整个文件。例如,它可以调用一个尚未声明但在文件下方声明的函数:

showAlert();

function showAlert() {
  alert("javascript is not executed line by line");
}

如果javascript只是逐行遍历文件,第一次遇到showAlert()是不会知道

的意思的。

如果发现语法错误,代码将不会 运行。请注意,您的第二个示例是不同的,因为它实际上没有语法错误——只是未知的 whatever.