通过 PHP 对移动设备进行唯一但持续的识别
Unique, but constant identification of mobile device through PHP
我正在尝试构建一段 PHP 脚本,该脚本将在调用页面时使用发送到服务器的 HTTP 请求来唯一标识移动设备。
我知道 $_SERVER
中有 UNIQUE_ID
,但这是针对每个请求而非每个设备生成的随机字符串。到目前为止,看起来 HTTP 请求的设置是为了阻止我正在做的事情,阻止服务器在未经用户同意的情况下跟踪用户。
问题是,我需要一种方法来识别设备,以便它加载存储在我的数据库中的正确信息亭显示。 IP地址不可行,因为我会在办公室设置设备,然后将其运送到目的地,这样IP就会改变。
我可以在第一次加载页面时使用 cookie 和 UNIQUE_ID
,但如果历史记录被删除,设备将与其之前的设置断开关联。
我考虑过自己创建一个随机字符串,这样如果设置被擦除,用户只需输入该字符串即可重新关联它,但这背后的整个想法是我正在尝试完全避免用户输入。
另一种选择是使用 SureFox 远程管理我的设备,但我正在努力保持尽可能多的控制。
关于如何在 PHP 中每次从服务器请求页面时唯一标识设备的任何想法?
唯一可以在历史记录重置后保留的信息是 user-agent 字符串。如果您可以控制设备(如您的情况)并且可以调整浏览器的配置以使用自定义 user-agent 字符串(设置方式取决于浏览器),这将起作用。
浏览器本身没有提供其他可以唯一标识设备的信息(cookie可以是reset/lost,IP变化,没有其他headers是浏览器自动发送的)。
另一种方法可能是自定义 link/command 启动浏览器以将设备标识作为查询字符串包含到 URL 中。更极端 - 自定义本地代理(即可以使用 Fiddler 建模)向所有请求添加自定义 headers。
好吧,在咬牙切齿之后,我已经弄明白了,感谢this post, this post, and 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
文件。它使我进行了配置文件证书安装 window。我点击安装,确认安装了一个未签名的证书,它向 /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。 cookie何时被擦除?只需重定向并再次获取 UDID!没有登录名,没有密码,所有设置都在我的数据库离开我的大楼之前完成。有趣的东西。
至于 Android,MDM 似乎没有那么集中。那里有很多 MDM 服务器,但我认为更简单的解决方案是使用已经开发的信息亭管理程序,如 SureFox,而不是重新发明轮子。虽然就 Android UDID 而言,这并不能完全回答我的问题,但它确实适用于我的解决方案,而且我可以节省购买 android 平板电脑而不是 iPad 的钱]s,购买多个许可证非常值得。
我正在尝试构建一段 PHP 脚本,该脚本将在调用页面时使用发送到服务器的 HTTP 请求来唯一标识移动设备。
我知道 $_SERVER
中有 UNIQUE_ID
,但这是针对每个请求而非每个设备生成的随机字符串。到目前为止,看起来 HTTP 请求的设置是为了阻止我正在做的事情,阻止服务器在未经用户同意的情况下跟踪用户。
问题是,我需要一种方法来识别设备,以便它加载存储在我的数据库中的正确信息亭显示。 IP地址不可行,因为我会在办公室设置设备,然后将其运送到目的地,这样IP就会改变。
我可以在第一次加载页面时使用 cookie 和 UNIQUE_ID
,但如果历史记录被删除,设备将与其之前的设置断开关联。
我考虑过自己创建一个随机字符串,这样如果设置被擦除,用户只需输入该字符串即可重新关联它,但这背后的整个想法是我正在尝试完全避免用户输入。
另一种选择是使用 SureFox 远程管理我的设备,但我正在努力保持尽可能多的控制。
关于如何在 PHP 中每次从服务器请求页面时唯一标识设备的任何想法?
唯一可以在历史记录重置后保留的信息是 user-agent 字符串。如果您可以控制设备(如您的情况)并且可以调整浏览器的配置以使用自定义 user-agent 字符串(设置方式取决于浏览器),这将起作用。
浏览器本身没有提供其他可以唯一标识设备的信息(cookie可以是reset/lost,IP变化,没有其他headers是浏览器自动发送的)。
另一种方法可能是自定义 link/command 启动浏览器以将设备标识作为查询字符串包含到 URL 中。更极端 - 自定义本地代理(即可以使用 Fiddler 建模)向所有请求添加自定义 headers。
好吧,在咬牙切齿之后,我已经弄明白了,感谢this post, this post, and 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
文件。它使我进行了配置文件证书安装 window。我点击安装,确认安装了一个未签名的证书,它向 /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。 cookie何时被擦除?只需重定向并再次获取 UDID!没有登录名,没有密码,所有设置都在我的数据库离开我的大楼之前完成。有趣的东西。
至于 Android,MDM 似乎没有那么集中。那里有很多 MDM 服务器,但我认为更简单的解决方案是使用已经开发的信息亭管理程序,如 SureFox,而不是重新发明轮子。虽然就 Android UDID 而言,这并不能完全回答我的问题,但它确实适用于我的解决方案,而且我可以节省购买 android 平板电脑而不是 iPad 的钱]s,购买多个许可证非常值得。