Facebook iOS应用程序如何在其WebView User-Agent中了解移动运营商

时间:2017-07-27 20:19:33

标签: ios facebook mobile user-agent

今天我在不同的iOS应用程序(如Facebook和Twitter)上分析WebViews中的User-Agents。

当您点击帖子/推文中的链接时,它会打开应用内浏览器(仍然使用iOS浏览器引擎)。

我通过写一个我放在网上的小PHP脚本来检索用户代理:

echo "PHP HTTP_USER_AGENT: " . $_SERVER['HTTP_USER_AGENT'] . PHP_EOL;

然后您只需使用该网址创建一个新的Facebook帖子,即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
  3. 我在iPad上运行同样的东西,现在实际上没有安装SIM卡并且仅在 WiFi 上运行,但是为了测试,我安装了一个SIM卡几个月前。移动运营商个人资料仍然可以在Settings - General - About - Carrier中看到 - 即使重新启动后它仍会保留在那里。

    我在网上找不到任何关于它的信息。私人IP似乎很无聊(在iPad上也是如此),但Facebook如何获得移动运营商名称?我很惊讶在iOS应用程序中允许,Apple似乎对泄露此类数据非常严格。 Safari的用户代理当然没有这样的附件。

    我很确定Facebook不仅仅使用像maxmind这样的地理定位服务来查找IP及其ASN。因为1)maxmind显示该移动IP的Deutsche Telekom AG和2)即使我使用的是根本没有运行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。

1 个答案:

答案 0 :(得分:1)

移动运营商可在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;
}