Google如何检测来自WebView的请求?

谷歌宣布他们将不再允许在embedded式浏览器中向Google发出OAuth请求,称为“web-views”

在Android中,来自WebViews的请求会获得HTTP_X_REQUESTED_WITH头HTTP_X_REQUESTED_WITH ,该头HTTP_X_REQUESTED_WITH被设置为应用程序的软件包名称。 虽然这可以被覆盖,所以可以使用WebView向服务器隐藏我们正在发出的请求。 我不知道任何其他默认的方式来做到这一点。

有没有办法检测,服务器端 – 无论客户端做什么,一个请求是从一个Android WebView。 Google如何完成这项工作?

Solutions Collecting From Web of "Google如何检测来自WebView的请求?"

不直接回答您的问题(对不起),而是关于您引用的OAuth的WebView的弃用:即使您find一种方法来避免在OAuthstream中检测到WebView,但这样做可能会违反Google API服务:用户数据政策 ,尤其是“不要误导Google关于应用程序的运行环境”一节。 所以我不会推荐。

通常,使用自定义标签进行OAuth(例如通过Android的AppAuth )会导致更好的用户体验 ,因为用户可能已经loginGoogle,从而无需再次login即可查看您的请求。 这也是一个更安全的体验。 这就是迁移的目标 – 为最终用户提供更安全,更实用的OAuth体验:-)

正如其他人所说,WebView和普通浏览器之间存在一系列差异,但是它们都是从浏览器的头部发送的数据,因此您可以绕行浏览它们。

然而,有一个libaray https://github.com/Valve/fingerprintjs2所以你可以阅读,但看到他们做的细节。 因为它创build了一个设备指纹,所以谷歌可以采用这样的粘性滴答作为检测/

也有可能他们可以在WebView核心代码中运行自己的Javascript,而这些代码是无法删除的,他们可以从中检测到它。 所以除非你把自己的浏览器作为视图来包装,否则你将无法绕过检测。

也可以像上面的方法一样,他们可以在隐藏的iframe中使用chrome://系统,并从中检测内容来识别EG chrome:// about-view /并打印硬编码的User-Agent。 再次唯一的方式来绕行这将是推出自己的浏览器。

正如@WilliamDenniss所说的,如果他们检测到他们可能会阻止您的应用和您的帐户,以及您的帐户中的所有应用,并阻止您再次从该帐户发布应用,则可以进行标题循环。

我不认为谷歌正计划对WebViews进行任何forms的暴力检测,我认为政策的改变只是为了启动一个新的规范。 谷歌不必强制执行它,如果它成为常态,用户会发现一个应用程序提出通过embedded式浏览器login的黑幕 – 而用户将需要遵守。 (我并不是说应用程序的每个用户都必须提出这样的请求,但是我敢打赌,对于任何至less有一个声音的应用程序来说,这是有说服力的。)

所有通过webview发送的http请求都有X-Requested-With头部,可以用来检测请求是否来自webview。

X-Requested-With: the.app.packageName

您可以通过用户代理string进行区分。 请参阅https://mobiforge.com/research-analysis/webviews-and-user-agent-strings

例如默认的Chrome浏览器包含下面的“(KHTML,像Gecko)Chrome / xx.xx …”,但默认的Web浏览器是“(KHTML,如Gecko)Version 4.0 Chrome / xx.xx ..”似乎webview有一个额外的版本string。