首页 > 解决方案 > ChromeDriver 未通过 Java ZAP API 代理本地流量

问题描述

我对 ZAP 很陌生,我必须使用 ZAP java API 在 Web 应用程序上执行安全测试,使用 Selenium 在浏览器上导航,为 ZAP 创建流量。我正在使用 Eclipse IDE for Enterprise Java Developers 版本 2019-03 (4.11.0) 和 Java jdk-1.8.0_212 和 Maven 3.5.3,以及 3 个导入的库:harlib 版本 1.1.1 (edu.umass.cs.benchlab harlib )、zap api 版本 1.7.0 (org.owasp zaproxy-api) 和代理版本 2.4.2 快照 (net.continuumsecurity zap-java-api)

我遵循了本教程:https ://dzone.com/articles/automate-zap-security-tests-with-selenium-webdrive-1 ,它有效。回顾一下,它使用了 3 个类:一个用于实例化 Web 浏览器 (BrowserDriverFactory.java),一个用于实际存储所有导航功能和参数 (WebSiteNavigation.java),另一个用于创建 ZAP 代理,对其进行配置并执行安全测试作为@Test 函数(ZapSecurityTest.java)。

我在代理我的本地应用程序时遇到了一点问题::我的本地应用程序似乎不使用 ZAP 代理,即使我的 chromedriver 非常了解代理(我在 ZAP UI 中看到非本地流量)。奇怪的是,我什至明确地将我的本地 URL 添加到上下文中并将其设置为范围:

clientapi.context.includeInContext(contextName, 
 java.util.regex.Pattern.quote(WebSiteNavigation.BASE_URL));

clientapi.context.setContextInScope(contextName, "true");

完成此操作并在我的本地应用程序上导航后,我在 ZAP UI 中看到相关的非本地流量,但看不到本地流量。当我检查 clientapi.context.urls(contextName) 返回的内容时,它是空的。

我创建我的代理:

private static Proxy createZapProxyConfiguration() {
       Proxy proxy = new Proxy();
       proxy.setHttpProxy(ZAP_PROXYHOST + ":" + ZAP_PROXYPORT);
       proxy.setSslProxy(ZAP_PROXYHOST + ":" + ZAP_PROXYPORT);
       return proxy;
}

由以下人员调用:

@Before
public void setUp() {
    // Configure ZAP Scanner
    zapScanner = new ZAProxyScanner(ZAP_PROXYHOST, ZAP_PROXYPORT,  
     ZAP_APIKEY);
    clientapi = new ClientApi(ZAP_PROXYHOST, ZAP_PROXYPORT);   

    // Start new session
    zapScanner.clear();
    log.info("Started a new session: Scanner");

    // Create ZAP API client
    zapSpider = (Spider) zapScanner;

    // Create driver object
    driver = BrowserDriverFactory.createChromeDriver 
     (createZapProxyConfiguration(), BROWSER_DRIVER_PATH);
    siteNavigation = new WebSiteNavigation(driver);
}

这也叫:

public static WebDriver createChromeDriver(Proxy proxy, String path) {
       // Set proxy in the chrome browser
       DesiredCapabilities capabilities = DesiredCapabilities.chrome();
       capabilities.setCapability("proxy", proxy);

       // Set system property for chrome driver with the path
       System.setProperty("webdriver.chrome.driver", path);
       capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
       ChromeOptions options = new ChromeOptions();
       options.merge(capabilities);
       return new ChromeDriver(options);
}

奇怪的是,几天前当我第一次设置它时,它就像一个魅力......然后我尝试自动化身份验证过程,从那时起,它就不起作用了......

我在这里错过了什么吗?我至少在寻找正确的地方?

标签: javaseleniumproxyselenium-chromedriverzap

解决方案


默认情况下,Chrome 默认不会代理发送到 localhost 的请求,因此如果您遇到这种情况,您需要向 chrome 驱动程序传递一个附加标志。这是使用 JSON 配置的方式:

capabilities: {
    browserName: 'chrome',
    proxy: proxy
    chromeOptions: {
      args: ['--proxy-bypass-list=<-loopback>']
    }
  },

使用 Java API 也可以做到这一点。


推荐阅读