Facebook iOS 应用如何在其 WebView 用户代理中识别移动运营商
how does Facebook iOS app know the mobile carrier in its WebView User-Agent
今天我在不同的 iOS 应用程序(例如 Facebook 和 Twitter)上分析 WebView 中的用户代理。
当您在 post/tweet 中单击 link 并打开应用内浏览器时(仍在使用 iOS 浏览器引擎)。
我通过编写一个放在网上的小 PHP 脚本检索了用户代理:
echo "PHP HTTP_USER_AGENT: " . $_SERVER['HTTP_USER_AGENT'] . PHP_EOL;
然后您只需使用 URL 创建一个新的 facebook post,即 http://mywebserver.com/get-my-ua.php
- 然后在应用内浏览器中打开它。
令我惊讶的是,一个特定的用户代理看起来非常有趣:来自 Facebook 应用程序:
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 [FBAN/FBIOS;FBAV/133.0.0.11.22;FBBV/65438308;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/10.3.3;FBSS/2;FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0]
开头看起来一般,但是附件很有意思:
- 包含某种私人 IP:
133.0.0.11.22
(我已经审查了最后两部分)
- 它知道移动运营商名称!
Telekom.de
我 运行 在 iPad、 上实际上没有安装 SIM 卡 和 运行s 同样的事情仅限 WiFi,但为了测试,我几个月前安装了 SIM 卡。移动运营商配置文件在 Settings - General - About - Carrier
中仍然可见 - 即使在重新启动后它仍然存在。
我在网上找不到任何关于它的信息。私有IP看起来很无聊(在iPad上也是一样),但是Facebook到底是怎么得到移动运营商名称的呢?我很惊讶 iOS 应用程序允许这样做,Apple 似乎对泄露此类数据非常严格。 Safari的User-Agent当然没有这样的附件。
我很确定 Facebook 不只是使用像 maxmind 这样的地理 IP 定位服务来查找 IP 及其 ASN。因为 1) maxmind 显示该移动 IP 的 Deutsche Telekom AG
和 2) 即使我使用根本不是 运行ning Telekom 的 WiFi,它仍然会显示 Telekom.de
。
您可以打开和关闭 WiFi,禁用移动数据,它将始终显示相同的用户代理。我认为那是因为仍然安装了移动运营商配置文件。但是它是如何获得这些信息的呢?
这是来自 Twitter 应用内浏览器的用户代理:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14G60 Twitter for iPhone
iPhone 和 iPad 都安装了最新的应用程序,以及最新的 iOS 10.3.3.
iOS 提供的 SIM 信息中提供了移动运营商。这是我拥有的:
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
@property (nonatomic, strong) CTTelephonyNetworkInfo* networkInfo;
- (void)setup
{
self.networkInfo = [[CTTelephonyNetworkInfo alloc] init];
}
- (NSString*)simCarrierName
{
return [networkInfo subscriberCellularProvider].carrierName;
}
- (NSString*)simIsoCountryCode
{
if ([[networkInfo subscriberCellularProvider].isoCountryCode length] == 2)
{
return [[networkInfo subscriberCellularProvider].isoCountryCode uppercaseString];
}
else
{
return nil;
}
}
- (NSString*)simMobileCountryCode
{
if ([[networkInfo subscriberCellularProvider].mobileCountryCode length] == 3)
{
return [networkInfo subscriberCellularProvider].mobileCountryCode;
}
else
{
return nil;
}
}
- (NSString*)simMobileNetworkCode
{
return [networkInfo subscriberCellularProvider].mobileNetworkCode;
}
今天我在不同的 iOS 应用程序(例如 Facebook 和 Twitter)上分析 WebView 中的用户代理。
当您在 post/tweet 中单击 link 并打开应用内浏览器时(仍在使用 iOS 浏览器引擎)。
我通过编写一个放在网上的小 PHP 脚本检索了用户代理:
echo "PHP HTTP_USER_AGENT: " . $_SERVER['HTTP_USER_AGENT'] . PHP_EOL;
然后您只需使用 URL 创建一个新的 facebook post,即 http://mywebserver.com/get-my-ua.php
- 然后在应用内浏览器中打开它。
令我惊讶的是,一个特定的用户代理看起来非常有趣:来自 Facebook 应用程序:
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 [FBAN/FBIOS;FBAV/133.0.0.11.22;FBBV/65438308;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/10.3.3;FBSS/2;FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0]
开头看起来一般,但是附件很有意思:
- 包含某种私人 IP:
133.0.0.11.22
(我已经审查了最后两部分) - 它知道移动运营商名称!
Telekom.de
我 运行 在 iPad、 上实际上没有安装 SIM 卡 和 运行s 同样的事情仅限 WiFi,但为了测试,我几个月前安装了 SIM 卡。移动运营商配置文件在 Settings - General - About - Carrier
中仍然可见 - 即使在重新启动后它仍然存在。
我在网上找不到任何关于它的信息。私有IP看起来很无聊(在iPad上也是一样),但是Facebook到底是怎么得到移动运营商名称的呢?我很惊讶 iOS 应用程序允许这样做,Apple 似乎对泄露此类数据非常严格。 Safari的User-Agent当然没有这样的附件。
我很确定 Facebook 不只是使用像 maxmind 这样的地理 IP 定位服务来查找 IP 及其 ASN。因为 1) maxmind 显示该移动 IP 的 Deutsche Telekom AG
和 2) 即使我使用根本不是 运行ning Telekom 的 WiFi,它仍然会显示 Telekom.de
。
您可以打开和关闭 WiFi,禁用移动数据,它将始终显示相同的用户代理。我认为那是因为仍然安装了移动运营商配置文件。但是它是如何获得这些信息的呢?
这是来自 Twitter 应用内浏览器的用户代理:Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14G60 Twitter for iPhone
iPhone 和 iPad 都安装了最新的应用程序,以及最新的 iOS 10.3.3.
iOS 提供的 SIM 信息中提供了移动运营商。这是我拥有的:
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
@property (nonatomic, strong) CTTelephonyNetworkInfo* networkInfo;
- (void)setup
{
self.networkInfo = [[CTTelephonyNetworkInfo alloc] init];
}
- (NSString*)simCarrierName
{
return [networkInfo subscriberCellularProvider].carrierName;
}
- (NSString*)simIsoCountryCode
{
if ([[networkInfo subscriberCellularProvider].isoCountryCode length] == 2)
{
return [[networkInfo subscriberCellularProvider].isoCountryCode uppercaseString];
}
else
{
return nil;
}
}
- (NSString*)simMobileCountryCode
{
if ([[networkInfo subscriberCellularProvider].mobileCountryCode length] == 3)
{
return [networkInfo subscriberCellularProvider].mobileCountryCode;
}
else
{
return nil;
}
}
- (NSString*)simMobileNetworkCode
{
return [networkInfo subscriberCellularProvider].mobileNetworkCode;
}