2016-02-20 5 views
2

Я пытаюсь создать кусок PHP-скрипта, который однозначно идентифицирует мобильное устройство, используя HTTP-запрос, отправленный на сервер при вызове страницы.Уникальная, но постоянная идентификация мобильного устройства через PHP

Я знаю, что есть UNIQUE_ID в $_SERVER, однако это случайная строка, созданная уникально для каждого запроса, а не для каждого устройства. До сих пор похоже, что HTTP-запрос настроен для предотвращения того, что я делаю, чтобы серверы не отслеживали пользователей без их согласия.

Проблема заключается в том, что мне нужно определить устройство, чтобы он загрузил правильный дисплей киоска, который хранится в моей базе данных. IP-адрес невозможен, поскольку я устанавливаю устройство в своем офисе, а затем отправляю его в пункт назначения, и в этом случае IP-адрес изменится.

При первой загрузке страницы я мог использовать файл cookie и UNIQUE_ID, но если история удалена, устройство перестает связываться с его предыдущей настройкой.

Я думал о создании собственной строки, так что, если настройка будет стерта, пользователь может просто ввести строку, чтобы повторно связать ее, но вся идея заключается в том, что я стараюсь избегать пользовательский ввод вообще.

Другой вариант - использовать SureFox для удаленного управления моими устройствами, но я стараюсь держать как можно больше контроля.

Любые идеи о том, как я могу однозначно идентифицировать устройство в PHP каждый раз, когда он запрашивает страницы с сервера?

+0

Вы управляете «устройством» (по крайней мере, в том смысле, что вы можете изменить настройки браузера)? –

+0

Да, я установил устройство, поместил его в режим киоска и отправил его. Если возникнут какие-либо проблемы, пользователь позвонит мне. – Dexter

+0

Какие устройства (ы) мы говорим? – VolkerK

ответ

1

Ну, после некоторого кусания и скрежещения зубов у меня это получилось, благодаря 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); 
?> 

Далее я указал браузер Safari моего IPad к файлу .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, но я думаю, что более простым решением было бы использовать уже разработанную программу управления киосками, такую ​​как SureFox, а не изобретать колесо. Хотя это точно не отвечает на мой вопрос в отношении Android UDID, он работает для моего решения, и с деньгами, которые я сэкономил бы на покупке Android-планшета вместо iPad, более чем стоит платить за несколько лицензий.

+0

Обязательно обновите свой вопрос, чтобы было ясно, что вы ищете решение для iPad/iPhone. В противном случае ваш собственный ответ не является ответом.(Не могу проголосовать за ваш ответ, поскольку я понятия не имею, правильно ли это - все еще есть пара людей без устройств Apple, извините за это). –

+0

@AlexeiLevenkov Я планирую сегодня поработать над андроидом, который я также опубликую, поскольку у меня есть еще один день, прежде чем я смогу выбрать ответ. В настоящее время нет аналога Android для отправки файлов .mobileconfig от Apple, но я даже не изучал элементы входа в Google и элементы управления Android. При снижении стоимости планшетов для Android я могу просто купить лицензию SureFox Pro и сделать с ней. – Dexter

+0

После некоторого тестирования мне также нужно добавить, как запретить Apple-устройству отвечать на кучу либо двоичного, либо шестнадцатеричного кода, потому что он, похоже, прикручивает скрипт PHP, который пересекает XML – Dexter

2

Единственный фрагмент информации, который может быть сохранен при сбрасывании истории, - user-agent string. Это работает, если у вас есть контроль над устройством (как в вашем случае), и вы можете настроить конфигурацию браузера для использования пользовательской строки пользовательского агента (способ настройки зависит от браузера).

Нет никакой другой информации, которую сам браузер предоставляет, которая может однозначно идентифицировать устройство (файлы cookie могут быть сброшены/потеряны, изменения в IP, нет других заголовков, автоматически отправляемых браузером).

Альтернативный подход может заключаться в создании пользовательской ссылки/команды, которая запускает браузер, чтобы включить идентификацию устройства в URL как строку запроса. Более экстремальный - пользовательский локальный прокси (т. Е. Может моделировать с Fiddler), который добавляет пользовательские заголовки ко всем запросам.

+0

, я искал Google и обнаружил файл '.mobileconfig' для Apple. Я могу создать свой собственный уникальный идентификатор, который я могу установить до выхода устройства, и не нужно беспокоиться о том, что пользователь удаляет его, очищая историю. Мое единственное беспокойство было бы, если бы устройство было сброшено на заводские настройки, но я считаю, что могу это предотвратить. – Dexter

+0

@Dexter вы должны создать ответ с выбранным вами решением –

+0

@TobyAllen Я планирую, но я все еще работаю над деталями. Я хотел точно показать, как получить UDID с устройства Apple с помощью файла '.mobileconfig', поскольку информация повсюду. Мне может потребоваться до завтра, чтобы все вместе. – Dexter

Смежные вопросы