Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Преамбула: в Android есть система разрешений (permissions). Разрешения могут быть уровня normal (они предоставляются без вопросов), dangerous (приложение обязано запросить разрешение у пользователя), signature (приложение должно быть подписано тем же ключом, что и компонент, предоставляемый по разрешению) и нескольких других системных типов, используемых только приложениями из комплекта прошивки.
Кроме того, приложения могут декларировать свои собственные разрешения, которые должны использовать другие приложения для доступа к возможностям этого приложения (запускать активности, получать данные из content provider’ов и так далее). Декларация таких разрешений в манифесте выглядит примерно так:
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="dangerous" />
<activity android:name=".CoolCamActivity" android:exported="true" android:permission="com.mycoolcam.USE_COOL_CAMERA">
<intent-filter>
<action android:name="com.mycoolcam.LAUNCH_COOL_CAM" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
Сейчас доступ к активности CoolCamActivity
защищен с помощью разрешения com.
.
А теперь ошибки, которые совершают разработчики, когда декларируют свои разрешения и защищают ими компоненты:
Уровень разрешения не указан. Если в предыдущем примере не указать уровень разрешения (android:
), он станет normal и в итоге доступ к защищенной активности сможет получить какое угодно приложение (достаточно указать в манифесте, что оно использует это разрешение).
Уровень разрешения signature не определен во всех приложениях. Допустим, у тебя есть два приложения, которые должны обмениваться данными. Чтобы защитить их от несанкционированного доступа, ты добавляешь в приложение 1 определение разрешения:
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="signature" />
При этом в приложении 1 такого определения нет, так как оно только использует это разрешение. В итоге если на устройство установить только второе приложение, то Android, ничего не знающий о разрешении com.
, автоматически назначит ему уровень normal вместо определенного в приложении 1 уровня signature.
Добавляй определение разрешения во все приложения.
Отсутствие каких‑либо разрешений. Допустим, есть приложение, которое использует системное разрешение android.
. У этого приложения есть content provider, который предоставляет доступ к базе данных приложения, включая контакты пользователей. И этот content provider не защищен никаким разрешением. В итоге сторонние приложения могут получить доступ к контактам пользователя опосредованно, через это приложение.
Hands on with Jetpack’s Security App Authenticator library — небольшая заметка о новой библиотеке в комплекте Android Jetpack.
Библиотека нужна для проверки подлинности сертификатов приложений, с которыми будет контактировать твое приложение. Делается это с помощью сверки контрольной суммы сертификата приложения и его сравнения с уже сохраненным списком контрольных сумм. Этакий SSL Pinning для приложений.
Перед тем как использовать библиотеку, в каталог подкаталоге xml
ресурсов приложения необходимо поместить XML-файл с произвольным именем и примерно следующим содержимым:
<?xml version="1.0" encoding="utf-8"?>
<app-authenticator>
<expected-identity>
<package name="com.example.app">
<cert-digest>7d5ac0f764d5ae47a051777bb5fc9a96f30b6b4d3bbb95cddb1c32932fb28b10cert-digest>
package>
expected-identity>
app-authenticator>
Этот файл говорит, что приложение с именем пакета com.
должно иметь сертификат с указанной контрольной суммой SHA-256.
Далее можно начать использовать библиотеку:
// Создаем экземпляр аутентификатора из описанного выше XML-файла
val authenticator = AppAuthenticator.createFromResource(context, R.xml.expected_app_identities)
// Первый способ проверки сертификата
val result = when (authenticator.checkAppIdentity("com.example.app")) {
AppAuthenticator.SIGNATURE_MATCH -> "Signature matches"
AppAuthenticator.SIGNATURE_NO_MATCH -> "Signature does not match"
else -> return
}
// Второй способ проверки с выбросом исключения
try {
authenticator.enforceAppIdentity("com.example.app)
// ...работаем с приложением
} catch (e: SecurityException) {
// ...не стоит доверять этому приложению
}
Как видно, есть несколько способов проверки. Первый удобно использовать для простых проверок. Второй удобен для использования в функциях работы с проверяемым приложением. Просто добавляем в их начало проверку, и все остальное сделает система обработки исключений.
|
|