Определите, запрашиваются ли HTTP-запросы из приложения Android или нет? и затем отреагировать соответствующим образом

У моего Android-приложения есть связанный с ним виджет приложения, который обновляется каждые 10 минут на устройстве Android. Эти обновления отправляют HTTP-запросы на данные на серверы и анализируют ответ сервера и обновляют приложение по мере необходимости.

На данный момент, если вы проверили этот URL из браузеров на своем ноутбуке или ПК, сервер ответит и обновит все, что требуется в базе данных на сервере.

То, что я хочу сделать, – это когда HTTP-запросы получены на сервере, я хочу определить, был ли запрос получен из моего Android-приложения с устройства Android, а затем отвечать данными. Я хотел бы изменить код на PHP на сервере таким образом, чтобы они отображали или перенаправляли на какую-либо страницу, если HTTP-запрос поступал из браузера или чего-либо другого, кроме моего Android-приложения.

Типичные HTTP-запросы из приложений похожи на http://example.com/abc.php?usera=abc&datab=xyz

Я не хочу отвечать на этот URL таким же образом, если он приходит откуда угодно, кроме приложения Android. Это возможно? Что было бы хорошим способом добиться этого.

Спасибо за вашу помощь.

Solutions Collecting From Web of "Определите, запрашиваются ли HTTP-запросы из приложения Android или нет? и затем отреагировать соответствующим образом"

Вы можете добавить подпись к запросу, а затем проверить его на стороне сервера.

Просто возьмите запрос и добавьте одно секретное слово в конец, затем сделайте MD5, который вы можете отправить в виде заголовка (или использовать как пользовательский агент). И на сервере вы делаете то же самое и проверяете, совпадает ли контрольная сумма.

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

Сделайте свой запрос похожим на http://example.com/abc.php?usera=abc&datab=xyz&timestamp=123456789 где timestamp – текущее время (в отметке времени unix) и добавьте это в ваше приложение:

public static String makeCheck(String url) { URL u=new URL(url); MessageDigest md = MessageDigest.getInstance("MD5"); u.getQuery(); md.update(u.getQuery().getBytes()); BigInteger bn = new BigInteger(1,md.digest("A_SECRET_WORD".getBytes())); return bn.toString(16); } 

И когда вам нужно добавить заголовок, используйте что-то вроде:

 request.addHeader("X-CHECKSUM", makeCheck(url) ); 

Затем на вашем сервере вы можете использовать:

 if (md5($_SERVER['QUERY_STRING']."A_SECRET_WORD")!=$_SERVER['X-CHECKSUM']) { // Wrong checksum } $timediff=60; if ( $_GET['timestamp']>(time()+$timediff) || $_GET['timestamp']<(time()-$timediff) ) { // Bad timestamp } 

Помните, что вы немного отстаете от метки времени, так как часы ваших серверов и часы телефонов могут быть немного синхронизированы.

Типичным способом выполнения этого является использование заголовка User-Agent в HTTP-запросе. если запрос поступает из стандартного браузера, он однозначно идентифицирует аппаратное и программное обеспечение. Например, у Nexus One под управлением Froyo будет следующий User-Agent:

 Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 

Однако, если вы используете HttpClient для выполнения запросов из своего приложения, вы можете настроить заголовок User-Agent, который использует HttpClient, как показано в этом ответе: Android HTTP User Agent .

На стороне сервера вы можете использовать совпадение регулярных выражений в заголовке User-Agent, чтобы определить, возник ли запрос из вашего приложения Android, и отправить соответствующий ответ.

Когда вы создаете HttpClient в android, вы можете установить следующее

  client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "MY Android device identifier"); 

Это устанавливает USER_AGENT для каждого запроса HTTP, отправляемого на ваш сервер. На вашем сервере вы можете получить USER_AGENT, чтобы определить, что запрос пришел с вашего устройства Android

Если фактический запрос одинаков (например, вы не можете добавить переменную POST или GET для активной идентификации вашего запроса), вам придется полагаться на другие вещи, такие как пользовательский агент.

Хотя вы можете установить их в соответствии с вашими пожеланиями в своем приложении (также см. Ответы @mark_bakker nd @mark_allison), вы должны знать, что есть способы поработать с этим, поэтому не используйте его для вещей, которые вы действительно не используете, t хочу, чтобы другие пользователи видели.

  • Пользователь Android может теоретически изменить строку user_agent между запросом, покидающим ваше приложение, и запросом, покидающим его / ее сеть. Поэтому не используйте его для «Пользователи Android не платили, поэтому не должны видеть эту / эту информацию»
  • В противоположность этому, пользователи, не являющиеся пользователями Android, могут явно изменить свой пользовательский агент, поэтому, если у вас есть контент, который должен видеть только ваш платный пользователь Android, он может подделать строку.

В конце концов, может быть, лучше просто изменить свой запрос, если вы можете: вы хотите другой ответ, вы должны сделать другой запрос, это мое мнение.