Подтвердить что ты не робот

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

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

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

изменить: например, теперь я использую 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]) и отправлять количество данных на мой сайт и делать это. или как я могу использовать службу отправки данных на сервер, более безопасную от такого рода опасностей?

4b9b3361

Ответ 1

После этого времени я прихожу с некоторыми ответами с моим собственным вопросом. эти советы относятся к стороне клиента 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')

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

Ответ 2

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

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

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

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

$field=$_POST['field'];


mysql_query("insert into `wp_comments` (`comment_content`)
                    values('$field')");

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

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

Ответ 3

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

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

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

  • Когда ваше приложение впервые установлено, сгенерируйте новую общедоступную/закрытую ключевую пару с помощью KeyPairGenerator, как указано в примере "Nkey P-256 EC key pair для подписи/проверки, используя ECDSA" .
  • После создания ключевой пары отправьте открытый ключ на ваш сервер, который сохранит этот ключ в вашей пользовательской базе данных.
  • Когда ваше приложение хочет сделать вызов API на ваш сервер, ему необходимо подписать запрос с помощью закрытого ключа; и сервер должен проверить эту подпись, используя открытый ключ пользователя. Если у запроса нет действительной подписи или подпись не может быть проверена, ваш сервер должен отказаться от запроса.

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

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

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

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Я написал простую структуру и справляюсь с ней так:

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

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);
    }
}

`