通过 PHP 对移动设备进行唯一但持续的标识

Posted

技术标签:

【中文标题】通过 PHP 对移动设备进行唯一但持续的标识【英文标题】:Unique, but constant identification of mobile device through PHP 【发布时间】:2016-02-20 06:17:03 【问题描述】:

我正在尝试构建一段 php 脚本,该脚本将使用调用页面时发送到服务器的 HTTP 请求来唯一标识移动设备。

我知道$_SERVER 中有UNIQUE_ID,但这是每个请求生成的随机字符串,而不是每个设备。到目前为止,看起来 HTTP 请求的设置是为了阻止我正在做的事情,以阻止服务器在未经用户同意的情况下跟踪用户。

问题是,我需要一种方法来识别设备,以便它加载存储在我的数据库中的正确信息亭显示。 IP 地址不可行,因为我会在办公室设置设备,然后将其运送到目的地,在这种情况下 IP 会更改。

我可以在第一次加载页面时使用 cookie 和 UNIQUE_ID,但如果历史记录被删除,设备将与之前的设置解除关联。

我想创建一个我自己的随机字符串,这样如果设置被擦除,用户可以简单地输入字符串来重新关联它,但这背后的整个想法是我试图避免用户完全输入。

另一种选择是使用 SureFox 远程管理我的设备,但我会尽量保持控制。

对于每次从服务器请求页面时如何在 PHP 中唯一标识设备有什么想法吗?

【问题讨论】:

你控制“设备”(至少在某种意义上你可以修改浏览器设置)? 是的,我设置了设备,将其置于信息亭模式,然后发货。如果有任何问题,用户会打电话给我。 我们在谈论什么样的设备? @VolkerK 我正在尝试在 iPad 和一些 android 平板电脑之间做出决定,以用作信息亭 那么简单地让用户登录 -> 设置 cookie。如果系统被擦除,用户必须重新登录。 (这更像是一个问题,而不是一个答案:“是什么阻碍了你这样做?”) 【参考方案1】:

唯一可以在历史重置时保留的信息是 user-agent 字符串。如果您可以控制设备(如您的情况)并且可以调整浏览器的配置以使用自定义用户代理字符串(设置方式取决于浏览器),则此方法有效。

浏览器本身没有提供可以唯一识别设备的其他信息(cookie可以重置/丢失,IP更改,浏览器不会自动发送其他标头)。

替代方法可能是使用自定义链接/命令来启动浏览器,以将设备标识作为查询字符串包含在 URL 中。更极端的 - 自定义本地代理(即可以使用 Fiddler 建模)将自定义标头添加到所有请求。

【讨论】:

我在 Google 上四处搜索,发现了 Apple 的 .mobileconfig 文件。我也许可以创建自己的唯一标识符,我可以在设备离开之前安装它,而不必担心用户会通过清除历史记录来删除它。我唯一担心的是设备是否被重置为出厂设置,但我相信我可以防止这种情况发生。 @Dexter 你应该用你选择的解决方案创建一个答案 @TobyAllen 我打算这样做,但我仍在研究细节。我想确切地展示如何使用.mobileconfig 文件从Apple 设备获取UDID,因为信息无处不在。不过,我可能要等到明天才能完成所有工作。【参考方案2】:

好吧,经过一番咬牙切齿之后,我终于弄明白了,感谢this post、this post 和this post。

我创建了一个名为UDID_request.mobileconfig 的文件。它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>PayloadContent</key>
        <dict>
            <key>URL</key>
            <string>http://kiosk.mydomain.com/setup/index.php</string>
            <key>DeviceAttributes</key>
            <array>
                <string>UDID</string>
                <string>IMEI</string>
                <string>ICCID</string>
                <string>VERSION</string>
                <string>PRODUCT</string>
            </array>
        </dict>
        <key>PayloadOrganization</key>
        <string>mydomain.com</string>
        <key>PayloadDisplayName</key>
        <string>Profile Service</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
        <key>PayloadUUID</key>
        <string>9CF421B3-9853-4454-BC8A-982CBD3C907C</string>
        <key>PayloadIdentifier</key>
        <string>com.mydomain.kiosk.profile-service</string>
        <key>PayloadDescription</key>
        <string>This temporary profile will be used to find and display your current device's UDID.</string>
        <key>PayloadType</key>
        <string>Profile Service</string>
    </dict>
</plist>

接下来,我创建了/setup/index.php

<?php
$data = file_get_contents("php://input");
file_put_contents("udidlog.txt", $data);
header('Location: http://kiosk.mydomain.com', true, 301);
?>

接下来,我将 iPad 的 Safari 浏览器指向我之前创建的 .mobileconfig 文件。我进入了配置文件证书安装窗口。我点击了安装,确认安装了未签名的证书,它向/setup/index.php 发送了响应,该响应将响应复制到我的udidlog.txt 文件,然后重定向到我的信息亭主页。

这并不容易。用其中一篇文章的话说,这是挑剔的。直到我的重定向正确等等,响应才被传递。

我得到的响应与证书签名混杂在一起,但重要的 XML 部分是纯文本,所以我使用以下方法提取了 XML:

function extract_xml_from_plist($data) 
    $sTag = "<?xml";
    $eTag = "</plist>";
    $startsAt = strpos($data, $sTag);
    $endsAt = strpos($data, $eTag, $startsAt) + strlen($eTag);
    $result = substr($data, $startsAt, $endsAt - $startsAt);
    return new SimpleXMLElement($result);


$xml = extract_xml_from_plist($file);

这是我收到的响应中的 XML:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ICCID</key>
    <string>8901 4104 2541 8901 7521</string>
    <key>IMEI</key>
    <string>01 266900 647352 2</string>
    <key>PRODUCT</key>
    <string>iPad2,2</string>
    <key>UDID</key>
    <string>591f30d41d0bd28597ad962491f1570ddbde4a8a</string>
    <key>VERSION</key>
    <string>9J2</string>
</dict>
</plist>

现在,我使用$xml-&gt;dict-&gt;key[n]$xml-&gt;dict-&gt;key[n] 创建了一个设备属性的关联数组,该数组由设备根据我的请求返回。我现在有一个唯一标识符,该标识符对于该设备将始终相同,我可以使用它来创建一种登录 cookie。饼干什么时候被擦掉?只需重定向并再次获取 UDID!没有登录名,没有密码,所有设置都在我的数据库中,然后才离开我的大楼。有趣的东西。

对于 Android,MDM 似乎没有那么集中。那里有很多 MDM 服务器,但我认为更简单的解决方案是使用像 SureFox 这样已经开发的信息亭管理程序,而不是重新发明***。虽然就 Android UDID 而言,这并不能完全回答我的问题,但它确实适用于我的解决方案,而且用我在购买 android 平板电脑而不是 iPad 上省下的钱,购买多个许可证非常值得。

【讨论】:

请确保也更新您的问题,以便清楚您正在寻找 iPad/iPhone 特定的解决方案。否则你自己的答案不是答案。 (无法对您的答案投票,因为我不知道这是否是正确的方式 - 仍然有几个人没有 Apple 设备,对此感到抱歉)。 @AlexeiLevenkov 我计划今晚也为 android 工作,我也会发布,因为我还有一天的时间可以选择答案。目前还没有用于 Apple 发送 .mobileconfig 文件的 Android 模拟,但我什至还没有探索过 Google 登录和 Android 配置文件控制。随着安卓平板成本的降低,我可能只需要购买 SureFox Pro 许可证就可以了。 经过一些测试,我还需要添加如何防止Apple设备响应一堆二进制或十六进制,因为它似乎与遍历XML的PHP​​脚本搞砸了 @Dexter 在您的服务器上使用 SureFox 时,有一种方法可以唯一地识别平板电脑,如果您需要任何帮助,请通过 techsupport@42gears.com 联系我们。 @RinkalBhanderi 感谢 Rinkal,毕竟我发现 SureFox 是最好的解决方案。我购买了许可证,阅读了文档并进行了设置,它运行良好,完全符合我的需要。

以上是关于通过 PHP 对移动设备进行唯一但持续的标识的主要内容,如果未能解决你的问题,请参考以下文章

获取移动设备唯一标识

移动设备(手机)的唯一ID有哪些

是否可以从移动设备获取唯一标识号?

移动设备(手机)的唯一ID有哪些

iOS获取设备唯一标识的8种方法

Android 设备唯一标识