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]

开头看起来一般,但是附件很有意思:

  1. 包含某种私人 IP:133.0.0.11.22(我已经审查了最后两部分)
  2. 它知道移动运营商名称! 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;
}