我正在为个人使用的macOS开发一个网络过滤应用程序。该应用程序应该捕获系统上的web浏览器应用程序生成的所有出站HTTP请求,并通过在本地DB中查找它们的URL来过滤(允许或删除)它们。
为此,我遵循作为WWDC 2019会话“现代Mac的网络扩展”的一部分提供的“现代Mac的网络扩展”应用程序的示例代码。
下面是我的NEFilterDataProvider子类
import NetworkExtension
import os.log
class FilterDataProvider: NEFilterDataProvider {
override func startFilter(completionHandler: @escaping (Error?) -> Void) {
let filterSettings = NEFilterSettings(rules: [NEFilterRule(networkRule: NENetworkRule(
remoteNetwork: nil,
remotePrefix: 0,
localNetwork: nil,
localPrefix: 0,
protocol: .TCP,
direction: .outbound
), action: .filterData)], defaultAction: .allow)
apply(filterSettings) { error in
if let applyError = error {
os_log("Failed to apply filter settings: %@", applyError.localizedDescription)
}
completionHandler(error)
}
}
override func handleNewFlow(_ flow: NEFilterFlow) -> NEFilterNewFlowVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let url = socketFlow.url else {
return .allow()
}
/* .drop() if url found in local DB */
return .allow()
}
}虽然,我能够在handleNewFlow中捕获url,但这似乎不是一个优雅或最佳的解决方案。我非常关注性能,因为它捕获了系统上任何应用程序生成的所有TCP出站流量,而不仅仅限于来自web浏览器应用程序的HTTP出站流量。
我可以想出可能的解决方案,但我无法找到在macOS上实现该功能的API:
NEFilterBrowserFlow,但不仅适用于基于WebKit的浏览器,而且适用于所有浏览器?sourceAppIdentifier这样的东西与浏览器应用程序的包标识符相匹配?发布于 2022-03-24 07:43:00
我意识到这是一个相当晚的答复,但我偶然看到这篇文章时,查看内容过滤器提供者本人。我可以看到,您已经有了将其转换为NEFilterSocketFlow的逻辑。你也试过选NEFilterBrowserFlow吗?这将为您提供WebKit浏览器流。至于处理其他浏览器,它们都是在幕后使用WebKit,因此它应该涵盖所有浏览器。
https://stackoverflow.com/questions/64077093
复制相似问题