如何使用 Nokgiri 或 Mechanize 确认 JavaScript 弹出窗口

How to confirm a JavaScript popup using Nokgiri or Mechanize

我是 运行 将在我的本地主机上打开的脚本。我的本地服务器是一个易受攻击的网络应用程序测试套件。

我正在尝试从 JavaScript 警报中确认 XSS 弹出窗口。例如:

http://127.0.0.1:65412/v?=0.2<script>alert("TEST");</script>

我需要确认弹出窗口是使用 Mechanize 还是 Nokogiri 发生的。是否可以通过 Nokogiri 或 Mechanize 确认弹出窗口存在?

例如:

def page(site)
  Nokogiri::HTML(RestClient.get(site))
end

puts page('http://127.0.0.1:65412/v?=0.2<script>alert("TEST");</script>')

绝对不是,那是因为既不是 Mechanize 也不是 Nokogiri 运行 Javascript.

相反,您可以使用 Selenium

像这样:

require 'selenium-webdriver'

class AlertChecker
  Driver = Selenium::WebDriver.for :firefox
  def initialize(url)
    Driver.navigate.to url
  end
  def raise_alert(text)
    Driver.execute_script "alert('#{text}')"
    self
  end
  def safely_get_alert
    begin
      Driver.switch_to.alert
    rescue Selenium::WebDriver::Error::NoAlertOpenError
    end
  end 
end

用法:

alert_checker = AlertChecker.new("http://my.website")

alert = alert_checker.safely_get_alert
# => nil

alert_checker.raise_alert("hack")
alert = alert_checker.safely_get_alert
puts alert.text
# => 'hack'

# As far as I'm aware Selenium doesn't have a built-in way
# to tell you if it's an alert, confirm, or prompt.
# But you know it's a prompt, for example, you could also send
# keys before accepting or dismissing
alert.accept

alert = alert_checker.safely_get_alert
# => nil 

不过,Selenium 处理警报时有一些棘手的事情。

如果不使用 rescuetry 之类的东西,您的代码将无法检测类型(提示、确认或警告)。一切都通过 switch_to.alert.

到达

此外,如果您的浏览器打开了警报,您将无法 运行 任何后续命令,除非您处理警报。假设您在警报打开时尝试 navigate.to;您会收到类似 您没有处理警报 并且您的 navigate.to 命令必须重新 运行 的错误。出现此错误时,警报对象也将丢失。

以这种方式使用 rescue 作为控制结构有点没有吸引力,但我不知道任何其他选项

Nokogiri,而 Mechanize 因为它构建在 Nokogiri 之上,所以可以解析 HTML 和 return 和 <script> 标签的内容。标签的内容是文本,所以此时有必要查看文本内部以找到您想要的内容:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
<head>
<script>alert("TEST");</script>
</head>
</html>
EOT

script_content = doc.at('script').content # => "alert(\"TEST\");"

很容易检查此时是否存在子字符串:

script_content['alert("TEST");'] # => "alert(\"TEST\");"

或:

!!script_content['alert("TEST");'] # => true

注意:Nokogiri 或 Mechanize 无法判断弹出窗口是否发生,因为它会在运行 JavaScript 的浏览器中发生。 Nokogiri 或 Mechanize 都不理解或解释 JavaScript。只有像 Watir 这样的工具或解释 JavaScript 的工具才能做到这一点。