【问题标题】:Check if html file would open JavaScript alert dialog检查 html 文件是否会打开 JavaScript 警报对话框
【发布时间】:2017-04-10 11:00:55
【问题描述】:

我想知道是否可以在 Java 中检测如果在浏览器中打开 HTML 文件是否会打开警报对话框。最好是无头的。例如,解析了一个具有以下内容的文件,它会返回 true。

<html><script>alert("hey")</script></html>

以下也将返回 true

<html><iframe src="javascript:alert(1)" onload="alert(2)"></iframe></html>

但下面的代码会返回 false,因为如果在浏览器中打开它不会打开警报对话框(因为没有任何代码在语法上是正确的,并且不在标签中的部分)。

<html><script>alert;,(123w)</script>alert(1)</html>

我已经想到了一种方法来解决这个问题,但它是有缺陷的。基本上,您会看到字符串alert(1) 是否在文件中,等等。 这样做的问题是,如果该代码不在脚本标签或使其执行的标签内,它就不起作用。它不起作用的一个示例是:以下将返回 true,即使它实际上不会打开弹出窗口 &lt;html&gt;alert(1)&lt;/html&gt;

顺便说一句,这不是 Android。感谢您的帮助!

【问题讨论】:

  • 使用正则表达式检查
  • 闻起来像停机问题。
  • @Novice 这几乎是 180⁰ 错误的方法。 not 使用正则表达式来解析 HTML,OP 已经提供了一个不起作用的示例。
  • @chrylis 请解释为什么 regexp 是一个不好的工具,当输入错误的 html 时它们会导致某种无限循环吗?我自己从来没有使用过正则表达式来完成这项任务,只是使用了库。所以我很好奇
  • @Novice HTML 不是常规语言。 Canonical answer.

标签: javascript java html parsing html-parsing


【解决方案1】:

您不仅需要验证警报功能是否存在,还需要检查 JavaScript 功能是否会运行。这方面的一个例子是,如果一个脚本在一个永远不会运行的函数中包含一个 Alert 函数。警报功能会在那里,但它永远不会运行。这会产生误报。因此,在最好的情况下,您应该以某种方式运行 JavaScript 来验证代码并查看函数是否会运行。

正如 Louis 在 cmets 中指出的那样,选项 2 在这种情况下更好,因为您需要考虑 DOM 和 JavaScript 的行为,因为如果 Alert 函数运行以及它的运行方式,两者都会发生变化。

选项 1:使用脚本引擎运行 JavaScript

您需要某种方法将 HTML 与 JavaScript 分开,但一旦有了,您就可以使用此方法。

您可以使用 ScriptEngine 在 Java 中运行 JavaScript。 https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html

如果您阅读了 API,则有一种方法可以创建变量并在您的 Java 程序和您正在运行的 JavaScript 之间进行通信。

要捕获警报的上下文,您可以创建一个覆盖警报函数的自定义 JavaScript 函数。在这个自定义函数中,您可以将函数的参数发送回您的 Java 程序。

选项 2:无头浏览器

您也可以尝试使用 JBrowserDriver 之类的无头浏览器,并且您可以看到您有一个带有 getText 作为函数的 Alert 界面。对于异步问题,无头浏览器有默认的等待脚本完成的时间。如果此默认数量不够,您可以使用 setScriptTimeout 来处理它。 http://machinepublishers.github.io/jBrowserDriver/

【讨论】:

  • 非常感谢您的回答!我要试试这个。如果有效,我会将其标记为答案。不过,我将在授予赏金之前稍等片刻,以防万一还有其他好的答案。欣赏!
  • 第一个选项仅适用于绝对琐碎的场景。按照上面的说明,这些将不起作用:在ScriptEngine 和上面给出的说明window.alert("foo")document.defaultView.alert("foo").. 他们可以在浏览器中工作。然后还有一些更复杂的情况,比如只有在 DOM 中存在某种事件状态时才会发出警报的页面。由于ScriptEngine 不提供DOM,因此在这些情况下它也不起作用。第二个选项更好,但现在显示了如何处理异步警报的意识。 (它们确实发生了。)
  • 你说得对,路易斯。我会说选项 2 在这种情况下是最好的。至于异步警报,无头浏览器通常会等待 X 完成或等待 X 时间,然后再抛出错误。使用 jBrowserDriver,他们有一个带有 setScriptTimeout 的超时设置,您可以在索引页面上找到它。这些文档不是为 Web 制作的,当您单击其上下文索引时不会更改 URI,因此我无法向您发送 URL。
  • 正如这个答案所指定的,您必须执行代码才能知道是否会出现警报。该脚本可以是 unicode 转义的,因此“\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0068\u0065\u0079\u0022\u0029\u003b”是另一种写“alert(“嘿”)”的方式,它也可以将其作为字符串并通过 eval() 运行。执行是了解脚本将做什么的唯一方法。我想知道为什么您想专门了解警报,如果这与安全相关,您需要找到另一种方法,因为警报是您的问题中最少的。
  • 如果您对安全性感到疑惑,您可以请求其他程序在虚拟机或类似设备中运行此检查并仅返回答案。
猜你喜欢
  • 2019-09-02
  • 2018-11-05
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多