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


Unique, but constant identification of mobile device through PHP

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

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

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

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

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

另一种选择是使用 SureFox 远程管理我的设备,但我试图尽可能多地保持控制。

关于每次从

服务器请求页面时如何在 PHP 中唯一标识设备的任何想法?

唯一可以在历史记录重置后保留的信息是用户代理字符串。如果您可以控制设备(如您的情况),并且可以调整浏览器的配置以使用自定义用户代理字符串(设置方式取决于浏览器),则可以正常工作。

浏览器

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

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

好吧,经过一番咬牙切齿之后,我已经弄清楚了,感谢这篇文章,这篇文章,还有这篇文章。

我创建了一个名为 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->dict->key[n]$xml->dict->key[n] ,我根据我的请求创建了设备返回的设备属性的关联数组。我现在有一个唯一标识符,该设备将始终相同,我可以使用它来创建一种登录cookie。饼干什么时候擦干净?只需重定向并再次获取 UDID!没有登录名,没有密码,在它离开我的建筑物之前,所有这些都在我的数据库中设置。有趣的东西。

至于Android,MDM似乎不那么集中。那里有很多MDM服务器,但我认为更简单的解决方案是使用已经开发的Kiosk管理程序,如SureFox,而不是重新发明轮子。虽然就Android UDID而言,这并不能完全回答我的问题,但它确实适用于我的解决方案,并且我购买Android平板电脑而不是iPad可以节省的钱,因此值得为多个许可证付费。