Intereting Posts
Почему я получаю ошибку? Канал невосстановимо сломан и будет утилизирован! Кнопка Toggle с использованием двух изображений в разных состояниях Android game loop vs обновление в потоке рендеринга Как создать активность и службу Android, которые используют отдельные процессы Увольнение ProgressDialog в android Как обратная анимация фрагментов на BackStack? Фигура для холста рисует черную линию В чем смысл новой аннотации @SystemApi, любая разница от @hide? Построить путь неполным только в некоторых рабочих пространствах (Android) Эмулятор: ПРЕДУПРЕЖДЕНИЕ: Не удалось инициализировать эмуляцию OpenglES, используя программный рендеринг Multi Выберите <select> на мобильных устройствах Как начать работу по истечении определенного периода времени? Удалить дорожку прокрутки из ScrollView в Android Преобразование приложения Ruby on Rails в собственное приложение Android PhoneGap Android: изменить URL-адрес пути без "/"

Безопасность для Android-приложения в общении с webservice

Я разрабатываю приложение для Android для сайта, в котором я создал в нем возможность отправлять данные в базу данных сайта в приложении. Я использую PHP-сервисы и URL-адреса в коде Android для подключения к веб-службе. Как я могу сделать свое приложение (и мой веб-сервис php) безопасным, чтобы никто не мог найти URL-адрес веб-службы, отлаживая мой apk и отправляя количество данных на сайт и удаляя сайт.

Любые советы для обеспечения безопасности программного обеспечения от таких опасностей могут помочь мне, спасибо (извините за плохой английский)

Edit: например, теперь я использую AsyncTask для отправки url и данных в моем edittext, как показано ниже. Я использую этот код в своем oncreate для отправки данных в класс AsyncTask в имени AskServer ():

link = "http://mywebservice-adrress/name.php"; new AskServer().execute(link, edttext.getText().toString()); 

И вот мой doInBackground моего класса AsyncTask:

 @Override protected Object doInBackground(String... params) { BufferedReader buf = null; try { URL link = new URL(params[0]); URLConnection connect = link.openConnection(); connect.setDoOutput(true); OutputStreamWriter osw = new OutputStreamWriter(connect.getOutputStream()); String data = URLEncoder.encode("field","UTF8") +"="+ URLEncoder.encode(params[1], "UTF8"); sw.write(data); osw.flush(); } catch (Exception e) {e.printStackTrace();} return null; }// end doInbackground() 

И вот мой php-код в моем веб-сервисе:

 <?php include 'config.php'; $field=$_POST['field']; mysql_query("insert into `wp_comments` (`comment_content`) values('$field')"); ?> 

Это пример, и мой реальный код посылает гораздо больше данных на сервер, и, возможно, код выше не работает, я просто делаю свой вопрос более точным и конкретным, так как мне нужен пакет stackoverflow. Мой вопрос заключается в том, как сделать эти транзакции безопасными и безопасными от хакеров, которые могут отлаживать мой код и находить мой url, в коде выше (params [0]) и отправлять количество данных на мой сайт и делать это. Или как я могу использовать службу отправки данных на сервер, более безопасную от таких опасностей?

Solutions Collecting From Web of "Безопасность для Android-приложения в общении с webservice"

Вы не можете скрыть конечную точку любым способом (вы можете попробовать, но вы потерпите неудачу). Если приложение может запрашивать некоторые URL-адреса, каждый может. Вы могли бы посмотреть на такие услуги, как cloudflare , но вместо этого вы должны посмотреть на фактическую безопасность своего приложения.

Ваш вопрос «отправить количество данных на мой сайт и сделать это» не имеет большого смысла по отношению к вашему вопросу. Почему передача данных на ваш сервер сводит его вниз?

Если вы не спрашиваете о том, как смягчить (D) атаки DOS, что является целым другим уровнем предотвращения (с умеренным успехом используя дорогостоящие услуги).

То, о чем вам следует беспокоиться, – это реальная безопасность вашего приложения, например:

 $field=$_POST['field']; mysql_query("insert into `wp_comments` (`comment_content`) values('$field')"); 

Уязвим для SQL-инъекции .

Также не используется здесь, но вы можете проверить аутентификацию конечных точек приложения, используя, например, oAuth, чтобы вам не нужно было хранить имя пользователя + пароль в самом приложении, а «просто» токен доступа, который вы можете легко отменить.

В общем, другие ответы на ваш вопрос верны: трудно гарантировать, что только ваше приложение может использовать API вашего сервера. Суть проблемы такова: ничто не мешает злоумышленнику притворяться вашим приложением . Большинство контрмер – это то, что известно как «безопасность через безвестность». Примеры включают:

  1. Использование недокументированного «двоичного» формата запроса: с достаточным временем злоумышленник может просто перепроектировать ваш двоичный формат.
  2. Скрытие адреса конечной точки API: злоумышленник может просто обнюхать запрос, когда он переходит из вашего приложения через сеть, которую он контролирует на своем пути на ваш сервер.
  3. Требование наличия криптографической «подписи» для каждого запроса API: злоумышленник может просто перепроектировать ваше приложение и найти криптографический ключ, который используется. (Метод, известный как «криптография белого ящика», пытается затруднить извлечение ключа из вашего приложения, но он просто замедляет решительный противник.)

Тем не менее существует один метод, который теоретически может работать с новыми устройствами Android: используйте встроенную систему Keystore , которая предназначена для предотвращения использования злоумышленниками криптографических ключей, используемых вашим приложением. Краткий обзор того, что вам нужно сделать:

  1. Когда ваше приложение впервые установлено, сгенерируйте новую общедоступную / закрытую KeyPairGenerator пару с помощью KeyPairGenerator как описано в примере «Пара ключей ключа NIST P-256 EC для подписи / проверки с помощью ECDSA» .
  2. После создания ключевой пары отправьте открытый ключ на ваш сервер, который сохранит этот ключ в вашей пользовательской базе данных.
  3. Когда ваше приложение хочет сделать вызов API на ваш сервер, ему необходимо подписать запрос с помощью закрытого ключа ; И сервер должен проверить эту подпись, используя открытый ключ пользователя . Если у запроса нет действительной подписи или подпись не может быть проверена, ваш сервер должен отказаться от запроса.

Независимо от того, что делает злонамеренный пользователь, после того, как шаг 1 был завершен, а закрытый ключ безопасно хранится в Keystore устройства Android, нет способа извлечь этот ключ и использовать его для выдачи себя за ваше приложение. К сожалению, даже этот метод имеет критическую слабость: как вы можете проверить, что ваш запрос на шаге № 1 (где ваше приложение регистрирует его защищенный открытый ключ с вашим сервером)?

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

Безопасность для Android-приложения в RESTAPI

У нас есть файл «.so» для обеспечения безопасности в RESTAPI. «Файл» – это собственный скомпилированный файл от android NDK. У нас есть дизайн auth_key, который генерируется файлом «.so» в соответствии с «электронной почтой» и «паролем» пользователя. Он генерирует 265-значный ключ для авторизации. Значит, пользователь действителен или нет. А также этот же алгоритм также применяется на стороне сервера для получения исходных данных из ключа. Я вижу, что 99% -ый платежный шлюз также используется нашим собственным алгоритмом для генерации auth_key в «.so» – это собственный файл. Поскольку любой хакер не может отменить Engineer этот файл, чтобы получить исходный алгоритм для генерации auth_key

Даже если вы попытаетесь скрыть свою строку, добавив байты, используя символы, а что нет, в конечном итоге он все равно сделает сетевой вызов. Используя дамп TCP или HTTP-прокси, такие как Charles , ваш вызов перехватывается без перерывов.

Вам лучше сосредоточиться на защите доступа к вашему серверу и, возможно, изучить такие решения, как защита CloudFlare DDOS, если вы обеспокоены тем, что ваш сервер будет удален.

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

Затем используйте систему API, которая имеет одну конечную точку (это означает, что она является одной конечной точкой для всех запросов). SOAP или JSON-RPC V2 я предпочитаю последний по двум причинам: первый из них – SOAP, хотя он не должен различаться между ASP.NET и PHP в том, как обволакивает. И JSON-RPC – намного меньшая полезная нагрузка.

В сочетании с защищенной от SSL единой конечной точкой никто больше не может получить адрес сервера, поэтому вы можете реализовать базовую регистрацию для входа для базовой защиты, но если кто-то может деконструировать ваше приложение EG, это в Apache Cordova или что-то еще Я бы рекомендовал вам использовать систему входа пользователя.

МОЯ ПЕРВАЯ ТОЧКА – САМОЕ ВАЖНОЕ ИСПОЛЬЗОВАНИЕ SSL ДЛЯ WEB-УСЛУГ. Это могут быть WebSockets, SOAP, JSON-RPC, REST все, что идет через веб-сервер.

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

Использование webserivce считается достаточно надежным, потому что ваши важные данные, такие как адрес электронной почты, ip, пароль, имя db, не нужны для записи в ваших проектах.

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

Пример – http://www.myweb.com/update?name= "hacker" & value = "1111111111"

Такой тип обмана может возникнуть при взломе вашего приложения.

Я предлагаю вам создать пользовательское шифрование и динамические данные –

Я имею в виду, вы должны получить весь URL-адрес от сервера / базы данных, а не закодировать с помощью проекта.

Пример – http: // www . "+ Web +" / "+ v1 +" = 1212121 "Такие сложные предложения могут заставить хакеров расстраиваться при декодировании. Динамическое значение также сложно найти и объединить.

Также попробуйте подстроку, чтобы сделать иллюзию. И получить спецификации подстроки с динамического сервера. Это заставляет хакеров аннулировать приложение, чтобы продолжить растрескивание.

Этот метод полезен для меня, но я не уверен для всех.

Как сказали все, вы не можете скрыть свои конечные точки. Единственный способ защитить ваш веб-сервис – это написать безопасный код.

В дополнение ко всему, что уже было сказано, я бы предложил несколько инструментов, которые я нашел очень простыми, но мощными для написания небольшой веб-службы:

  • OAuth2 Server PHP , imho, лучший ресурс для PHP в отношении Oauth2
  • Slim Framework , быстрый, простой, поддержка канала IRC, хорошая документация

Во-первых, вы можете перейти на https, что безопаснее.

Сек, вы можете сделать некоторое правило для параметров от клиента.

Я написал простую структуру и разбираюсь с ней так

`/ ** * проверить параметры * /

 private static function checkParams($params){ $data = $params['data']; $str = MD5_PREFIX; foreach($data as $k=>$v){ $str.=$k.$v; } if(md5($str) != $params['sign']){ throw new Exception("err sign",SIGN_NOT_CORRECT); } } 

`

После этого времени я прихожу с некоторыми ответами с моим собственным вопросом. Эти советы относятся к стороне сервера php-сервера для клиента Android, но логика может использоваться на других языках на стороне сервера.

 Security : 1- Validate input data 2- Filter input data 3- Bind parameters to refuse query injection 4- Give least access to user 5- Refuse Leakage info by disableing log and httpd.conf 6- Output Escaping : escape html in output for sites and useless for webservices Functions like : htmlspecialchars() Filter : diagnose XSS characters and filter them Validate : check if input data is like the data type we expect Filter functions : strip_tags() str_replace() preg_replace() Force Change DataType by placeing datatype before them : $input = (int) $input; Validat functions : stripos() preg_match() "ctype" functions like : ctype_alnum(text), ctype_alpha(text), ctype_digit(text) : if input is ctype validate type return true else return false isset() filter_var() Access to user : initialize all variables before use use if and else statements to check everything is ok to prevent showing errors try catch for PDO SQL errors HASH the password and important data in database set hard names for database tables and columns make index.php in the folder and use this code : <?php header('location',HOME_URL); exit; ?> in .htdocs paste this code : Options -Indexes Database security : $mysqli->real_escape_string($input); // for scape chars like ' " use stored procedures for refuse query injection. filter inputs for : stripos($input, 'UNION') 

Я надеюсь, что эти советы помогут