Как реализовать защиту API Cloudflare в Android с помощью HttpClient ⇐ Php
Как реализовать защиту API Cloudflare в Android с помощью HttpClient
Я использую HttpClient в своем приложении Android для подключения к моему PHP API на сервере. Проблема в том, что каждый, у кого есть URL-адрес, может получить доступ к содержимому моей базы данных MySQL с помощью API, что не очень хорошо. Я столкнулся с Cloudflare API Shield, но другая проблема заключается в том, что нет надлежащей документации или какой-либо информации о том, как реализовать его в приложениях для Android. Я попытался изменить код библиотеки запросов HttpClient, как показано ниже, чтобы он работал, но приложение Android выдает 403 неожиданный код ответа. Я проверил сертификат в браузере, он работает, но не в запросе HttpClient приложения Android.
В этом коде я инициализирую файл certificate.jks и передаю его в SSLSocketFactory
private SSLSocketFactory newSslSocketFactory() { пытаться { // Получаем экземпляр формата хранилища ключей Bouncy Castle Доверенное хранилище ключей = KeyStore.getInstance(KeyStore.getDefaultType()); // Получаем необработанный ресурс, содержащий хранилище ключей с // ваши доверенные сертификаты (корневые и любые промежуточные сертификаты) InputStream in = context.getResources().openRawResource(R.raw.certificate); пытаться { // Инициализируем хранилище ключей с предоставленными доверенными сертификатами // Также укажите пароль хранилища ключей доверенный.load(in, "DummyPass".toCharArray()); } окончательно { в.закрыть(); } // Передаем хранилище ключей в SSLSocketFactory. Фабрика несет ответственность // для проверки сертификата сервера. SSLSocketFactory sf = новый SSLSocketFactory (доверенный); // Проверка имени хоста по сертификату // http://hc.apache.org/httpcomComponents- ... tml#d4e506 sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); вернуть НФ; } catch (Исключение е) { выбросить новый AssertionError(e); } } И здесь я передаю SSLSocketFactory регистратору, чтобы передать его с параметрами на сервер.
public void Execute() { бегун = новый ProgressTask() { @Override protected ResponseData doInBackground (Void... params) { DefaultHttpClient httpclient = новый DefaultHttpClient(); Реестр SchemeRegistry = новый SchemeRegistry(); реестр.register(новая схема("https", newSslSocketFactory(), 443)); SingleClientConnManager mgr = новый SingleClientConnManager(httpclient.getParams(), реестр); httpclient = новый DefaultHttpClient(mgr, httpclient.getParams()); // Установка верификатора HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); пытаться { logging("URL: " + метод + " " + url.toString(), DEBUG); печатьЗаголовки(); ПечатьПарамс(); HttpRequestBase hrb = buildRequest(); HttpParams httpParams = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParams, тайм-аут); HttpConnectionParams.setSoTimeout(httpParams, тайм-аут); Ответ HttpResponse = httpclient.execute(hrb); int responseCode = response.getStatusLine().getStatusCode(); BufferedInputStream бис; если (response.getEntity() == null) { String jsonString = "{\"status\":\"Нет объекта сервера.\"}"; InputStream = новый ByteArrayInputStream(jsonString.getBytes()); бис = новый BufferedInputStream (есть, BUFF_SIZE); } еще { bis = новый BufferedInputStream(response.getEntity().getContent(), BUFF_SIZE); } StringBuilder sb = новый StringBuilder(); буфер байт[] = новый байт[BUFF_SIZE]; число байтовRead; while ((bytesRead = bis.read(buffer)) > 0) { sb.append(new String(buffer, 0, bytesRead, "UTF-8")); } бис.закрыть(); ResponseData responseData = новые ResponseData(responseCode, sb.toString().getBytes()); вернуть данные ответа; } catch (IOException e) { logging("Ошибка при попытке выполнить запрос", ERROR, e); если (requestListener != ноль) { requestListener.onConnectionError(e); } } catch (URISyntaxException e) { logging("Ошибка анализа URL", ОШИБКА, e); } вернуть ноль; } }; runner.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }
Я использую HttpClient в своем приложении Android для подключения к моему PHP API на сервере. Проблема в том, что каждый, у кого есть URL-адрес, может получить доступ к содержимому моей базы данных MySQL с помощью API, что не очень хорошо. Я столкнулся с Cloudflare API Shield, но другая проблема заключается в том, что нет надлежащей документации или какой-либо информации о том, как реализовать его в приложениях для Android. Я попытался изменить код библиотеки запросов HttpClient, как показано ниже, чтобы он работал, но приложение Android выдает 403 неожиданный код ответа. Я проверил сертификат в браузере, он работает, но не в запросе HttpClient приложения Android.
В этом коде я инициализирую файл certificate.jks и передаю его в SSLSocketFactory
private SSLSocketFactory newSslSocketFactory() { пытаться { // Получаем экземпляр формата хранилища ключей Bouncy Castle Доверенное хранилище ключей = KeyStore.getInstance(KeyStore.getDefaultType()); // Получаем необработанный ресурс, содержащий хранилище ключей с // ваши доверенные сертификаты (корневые и любые промежуточные сертификаты) InputStream in = context.getResources().openRawResource(R.raw.certificate); пытаться { // Инициализируем хранилище ключей с предоставленными доверенными сертификатами // Также укажите пароль хранилища ключей доверенный.load(in, "DummyPass".toCharArray()); } окончательно { в.закрыть(); } // Передаем хранилище ключей в SSLSocketFactory. Фабрика несет ответственность // для проверки сертификата сервера. SSLSocketFactory sf = новый SSLSocketFactory (доверенный); // Проверка имени хоста по сертификату // http://hc.apache.org/httpcomComponents- ... tml#d4e506 sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); вернуть НФ; } catch (Исключение е) { выбросить новый AssertionError(e); } } И здесь я передаю SSLSocketFactory регистратору, чтобы передать его с параметрами на сервер.
public void Execute() { бегун = новый ProgressTask() { @Override protected ResponseData doInBackground (Void... params) { DefaultHttpClient httpclient = новый DefaultHttpClient(); Реестр SchemeRegistry = новый SchemeRegistry(); реестр.register(новая схема("https", newSslSocketFactory(), 443)); SingleClientConnManager mgr = новый SingleClientConnManager(httpclient.getParams(), реестр); httpclient = новый DefaultHttpClient(mgr, httpclient.getParams()); // Установка верификатора HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); пытаться { logging("URL: " + метод + " " + url.toString(), DEBUG); печатьЗаголовки(); ПечатьПарамс(); HttpRequestBase hrb = buildRequest(); HttpParams httpParams = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParams, тайм-аут); HttpConnectionParams.setSoTimeout(httpParams, тайм-аут); Ответ HttpResponse = httpclient.execute(hrb); int responseCode = response.getStatusLine().getStatusCode(); BufferedInputStream бис; если (response.getEntity() == null) { String jsonString = "{\"status\":\"Нет объекта сервера.\"}"; InputStream = новый ByteArrayInputStream(jsonString.getBytes()); бис = новый BufferedInputStream (есть, BUFF_SIZE); } еще { bis = новый BufferedInputStream(response.getEntity().getContent(), BUFF_SIZE); } StringBuilder sb = новый StringBuilder(); буфер байт[] = новый байт[BUFF_SIZE]; число байтовRead; while ((bytesRead = bis.read(buffer)) > 0) { sb.append(new String(buffer, 0, bytesRead, "UTF-8")); } бис.закрыть(); ResponseData responseData = новые ResponseData(responseCode, sb.toString().getBytes()); вернуть данные ответа; } catch (IOException e) { logging("Ошибка при попытке выполнить запрос", ERROR, e); если (requestListener != ноль) { requestListener.onConnectionError(e); } } catch (URISyntaxException e) { logging("Ошибка анализа URL", ОШИБКА, e); } вернуть ноль; } }; runner.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Внедрите защиту от подделки в веб-API ASP.NET 8 Core, чтобы предотвратить атаку CSRF.
Anonymous » » в форуме C# - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-