我是ZAP的新手,我必须使用ZAP java API在Web应用程序上执行安全测试,使用Selenium在浏览器上导航,为ZAP创建流量。我正在使用Eclipse IDE企业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);
}
奇怪的是,几天前当我第一次设置它时,它就像一个魅力......然后我尝试自动化身份验证过程,从那时起,它不起作用......
我在这里错过了什么吗?我至少在看对地方?
默认情况下,Chrome 不会代理发送到 localhost 的请求,因此如果是这种情况,您需要向 chrome 驱动程序传递一个额外的标志。以下是使用 JSON 配置它的方式:
capabilities: {
browserName: 'chrome',
proxy: proxy
chromeOptions: {
args: ['--proxy-bypass-list=<-loopback>']
}
},
使用Java API也可以完成相同的操作。