mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-21 20:23:18 +00:00
Translated ['mobile-pentesting/android-app-pentesting/android-applicatio
This commit is contained in:
parent
3fd755b504
commit
e69c402c57
1 changed files with 66 additions and 66 deletions
|
@ -1,16 +1,16 @@
|
|||
# Android Applications Basics
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -20,33 +20,33 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
**有两个层次:**
|
||||
|
||||
* **操作系统**,它使已安装的应用程序彼此隔离。
|
||||
* **应用程序本身**,允许开发人员**暴露某些功能**并配置应用程序能力。
|
||||
* **应用程序本身**,它允许开发人员**暴露某些功能**并配置应用程序能力。
|
||||
|
||||
### UID Separation
|
||||
|
||||
**每个应用程序被分配一个特定的用户ID**。这在应用程序安装时完成,因此**应用程序只能与其用户ID拥有的文件或共享文件进行交互**。因此,只有应用程序本身、操作系统的某些组件和根用户可以访问应用程序的数据。
|
||||
**每个应用程序被分配一个特定的用户 ID**。这在应用程序安装时完成,因此**应用程序只能与其用户 ID 所拥有的文件或共享文件进行交互**。因此,只有应用程序本身、操作系统的某些组件和根用户可以访问应用程序的数据。
|
||||
|
||||
### UID Sharing
|
||||
|
||||
**两个应用程序可以配置为使用相同的UID**。这可以用于共享信息,但如果其中一个被攻破,则两个应用程序的数据都会受到影响。这就是为什么这种行为**不被鼓励**。\
|
||||
**要共享相同的UID,应用程序必须在其清单中定义相同的 `android:sharedUserId` 值。**
|
||||
**两个应用程序可以配置为使用相同的 UID**。这可以用于共享信息,但如果其中一个被攻破,则两个应用程序的数据都会受到影响。这就是为什么这种行为**不被鼓励**。\
|
||||
**要共享相同的 UID,应用程序必须在其清单中定义相同的 `android:sharedUserId` 值。**
|
||||
|
||||
### Sandboxing
|
||||
|
||||
**Android应用程序沙箱**允许**每个应用程序**作为**在单独用户ID下的单独进程**运行。每个进程都有自己的虚拟机,因此应用程序的代码与其他应用程序隔离运行。\
|
||||
从Android 5.0(L)开始,**SELinux**被强制执行。基本上,SELinux拒绝所有进程交互,然后创建策略以**仅允许它们之间的预期交互**。
|
||||
**Android 应用程序沙箱**允许**每个应用程序**作为**在单独用户 ID 下的单独进程运行**。每个进程都有自己的虚拟机,因此应用程序的代码在与其他应用程序隔离的情况下运行。\
|
||||
从 Android 5.0(L) 开始,**SELinux** 被强制执行。基本上,SELinux 拒绝所有进程交互,然后创建策略以**仅允许它们之间的预期交互**。
|
||||
|
||||
### Permissions
|
||||
|
||||
当你安装一个**应用程序并请求权限**时,应用程序是在请求**AndroidManifest.xml**文件中配置的**`uses-permission`**元素中的权限。**uses-permission**元素在**name**属性中指示请求的权限名称。它还有**maxSdkVersion**属性,该属性在版本高于指定版本时停止请求权限。\
|
||||
请注意,Android应用程序不需要在开始时请求所有权限,它们也可以**动态请求权限**,但所有权限必须在**清单中声明**。
|
||||
当你安装一个**应用程序并请求权限**时,应用程序是在请求**AndroidManifest.xml** 文件中配置的**`uses-permission`** 元素中的权限。**uses-permission** 元素在**name** **属性中指示请求的权限名称。**它还有 **maxSdkVersion** 属性,该属性在版本高于指定版本时停止请求权限。\
|
||||
请注意,Android 应用程序不需要在开始时请求所有权限,它们也可以**动态请求权限**,但所有权限必须在**清单中声明**。
|
||||
|
||||
当应用程序暴露功能时,它可以限制**仅允许具有指定权限的应用程序访问**。\
|
||||
权限元素有三个属性:
|
||||
|
||||
* 权限的**名称**
|
||||
* **permission-group**属性,允许对相关权限进行分组。
|
||||
* **protection-level**,指示权限的授予方式。共有四种类型:
|
||||
* 权限的 **name**
|
||||
* **permission-group** 属性,允许对相关权限进行分组。
|
||||
* **protection-level**,指示权限的授予方式。有四种类型:
|
||||
* **Normal**:用于**没有已知威胁**的应用程序。用户**不需要批准**它。
|
||||
* **Dangerous**:指示权限授予请求应用程序某些**提升的访问权限**。**请求用户批准**。
|
||||
* **Signature**:只有**由与导出组件相同证书签名的应用程序**才能获得权限。这是最强的保护类型。
|
||||
|
@ -54,87 +54,87 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
## Pre-Installed Applications
|
||||
|
||||
这些应用程序通常位于**`/system/app`**或**`/system/priv-app`**目录中,其中一些是**优化过的**(你可能甚至找不到`classes.dex`文件)。这些应用程序值得检查,因为有时它们**运行的权限过多**(作为root)。
|
||||
这些应用程序通常位于**`/system/app`** 或 **`/system/priv-app`** 目录中,其中一些是**优化过的**(你可能甚至找不到 `classes.dex` 文件)。这些应用程序值得检查,因为有时它们**运行的权限过多**(作为 root)。
|
||||
|
||||
* 随**AOSP**(Android开源项目)**ROM**一起提供的应用程序
|
||||
* 随 **AOSP**(Android 开源项目)**ROM** 一起提供的应用程序
|
||||
* 由设备**制造商**添加的
|
||||
* 由手机**提供商**添加的(如果是从他们那里购买的)
|
||||
|
||||
## Rooting
|
||||
|
||||
为了获得对物理Android设备的root访问权限,通常需要**利用**1或2个**漏洞**,这些漏洞通常是**特定于设备**和**版本**的。\
|
||||
一旦漏洞成功,通常会将Linux `su`二进制文件复制到用户PATH环境变量中指定的位置,如`/system/xbin`。
|
||||
为了获得对物理 Android 设备的 root 访问权限,通常需要**利用** 1 或 2 个**漏洞**,这些漏洞通常是**特定于**设备和**版本**的。\
|
||||
一旦漏洞成功,通常会将 Linux `su` 二进制文件复制到用户 PATH 环境变量中指定的位置,如 `/system/xbin`。
|
||||
|
||||
一旦su二进制文件配置完成,另一个Android应用程序将用于与`su`二进制文件接口并**处理root访问请求**,如**Superuser**和**SuperSU**(在Google Play商店中可用)。
|
||||
一旦配置了 su 二进制文件,另一个 Android 应用程序将用于与 `su` 二进制文件接口并**处理 root 访问请求**,如 **Superuser** 和 **SuperSU**(在 Google Play 商店中可用)。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,root过程非常危险,可能会严重损坏设备
|
||||
请注意,rooting 过程非常危险,可能会严重损坏设备
|
||||
{% endhint %}
|
||||
|
||||
### ROMs
|
||||
|
||||
可以通过**安装自定义固件来替换操作系统**。这样可以扩展旧设备的使用价值,绕过软件限制或获得最新的Android代码。\
|
||||
**OmniROM**和**LineageOS**是两个最流行的固件。
|
||||
可以通过**安装自定义固件来替换操作系统**。这样可以扩展旧设备的使用价值,绕过软件限制或获得最新的 Android 代码。\
|
||||
**OmniROM** 和 **LineageOS** 是两个最流行的固件。
|
||||
|
||||
请注意,**并不总是需要root设备**才能安装自定义固件。**一些制造商允许**以良好文档和安全的方式解锁其引导加载程序。
|
||||
请注意,**并不总是需要 root 设备**才能安装自定义固件。**一些制造商允许**以良好文档和安全的方式解锁其引导加载程序。
|
||||
|
||||
### Implications
|
||||
|
||||
一旦设备被root,任何应用程序都可以请求root访问。如果恶意应用程序获得了它,它将几乎可以访问所有内容,并能够损坏手机。
|
||||
一旦设备被 root,任何应用程序都可以请求 root 访问。如果恶意应用程序获得了它,它将几乎可以访问所有内容,并能够损坏手机。
|
||||
|
||||
## Android Application Fundamentals <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Android应用程序的格式被称为_ APK文件格式_。它本质上是一个**ZIP文件**(通过将文件扩展名重命名为.zip,可以提取和查看内容)。
|
||||
- APK内容(不详尽)
|
||||
- Android 应用程序的格式被称为 _APK 文件格式_。它本质上是一个**ZIP 文件**(通过将文件扩展名重命名为 .zip,可以提取和查看内容)。
|
||||
- APK 内容(不详尽)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc:包含预编译资源,如二进制XML。
|
||||
- resources.arsc:包含预编译资源,如二进制 XML。
|
||||
- res/xml/files\_paths.xml
|
||||
- META-INF/
|
||||
- 这里是证书所在的地方!
|
||||
- 这里是证书所在的位置!
|
||||
- **classes.dex**
|
||||
- 包含Dalvik字节码,表示应用程序默认执行的编译Java(或Kotlin)代码。
|
||||
- 包含 Dalvik 字节码,表示应用程序默认执行的编译 Java(或 Kotlin)代码。
|
||||
- lib/
|
||||
- 存放本地库,按CPU架构在子目录中隔离。
|
||||
- `armeabi`:ARM处理器的代码
|
||||
- `armeabi-v7a`:ARMv7及更高版本处理器的代码
|
||||
- `x86`:X86处理器的代码
|
||||
- `mips`:仅用于MIPS处理器的代码
|
||||
- 存放本地库,按 CPU 架构在子目录中分隔。
|
||||
- `armeabi`:ARM 处理器的代码
|
||||
- `armeabi-v7a`:ARMv7 及更高版本处理器的代码
|
||||
- `x86`:X86 处理器的代码
|
||||
- `mips`:仅用于 MIPS 处理器的代码
|
||||
- assets/
|
||||
- 存储应用程序所需的杂项文件,可能包括额外的本地库或DEX文件,有时被恶意软件作者用来隐藏额外代码。
|
||||
- 存储应用程序所需的杂项文件,可能包括额外的本地库或 DEX 文件,有时被恶意软件作者用来隐藏额外代码。
|
||||
- res/
|
||||
- 包含未编译到resources.arsc中的资源。
|
||||
- 包含未编译到 resources.arsc 中的资源。
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
在Android开发中,**Java或Kotlin**用于创建应用程序。与桌面应用程序使用JVM不同,Android将此代码编译为**Dalvik可执行文件(DEX字节码)**。早期,Dalvik虚拟机处理此字节码,但现在,Android Runtime(ART)在较新版本的Android中接管。
|
||||
在 Android 开发中,**Java 或 Kotlin** 用于创建应用程序。与桌面应用程序使用 JVM 不同,Android 将此代码编译为**Dalvik 可执行文件(DEX 字节码)**。早期,Dalvik 虚拟机处理此字节码,但现在,Android Runtime (ART) 在较新版本的 Android 中接管。
|
||||
|
||||
对于逆向工程,**Smali**变得至关重要。它是DEX字节码的人类可读版本,像汇编语言一样通过将源代码转换为字节码指令。Smali和baksmali在此上下文中指代汇编和反汇编工具。
|
||||
对于逆向工程,**Smali** 变得至关重要。它是 DEX 字节码的人类可读版本,像汇编语言一样通过将源代码转换为字节码指令。Smali 和 baksmali 在此上下文中指的是汇编和反汇编工具。
|
||||
|
||||
## Intents
|
||||
|
||||
Intents是Android应用程序在其组件之间或与其他应用程序之间通信的主要方式。这些消息对象还可以在应用程序或组件之间携带数据,类似于HTTP通信中使用的GET/POST请求。
|
||||
Intents 是 Android 应用程序在其组件之间或与其他应用程序之间通信的主要方式。这些消息对象还可以在应用程序或组件之间携带数据,类似于 HTTP 通信中使用的 GET/POST 请求。
|
||||
|
||||
因此,Intent基本上是**在组件之间传递的消息**。Intents**可以定向**到特定组件或应用程序,**也可以在没有特定接收者的情况下发送**。\
|
||||
简单来说,Intent可以用于:
|
||||
因此,Intent 基本上是**在组件之间传递的消息**。Intents **可以定向**到特定组件或应用程序,**也可以在没有特定接收者的情况下发送**。\
|
||||
简单来说,Intent 可以用于:
|
||||
|
||||
* 启动一个Activity,通常打开应用程序的用户界面
|
||||
* 启动一个 Activity,通常打开应用程序的用户界面
|
||||
* 作为广播通知系统和应用程序的变化
|
||||
* 启动、停止和与后台服务通信
|
||||
* 通过ContentProviders访问数据
|
||||
* 通过 ContentProviders 访问数据
|
||||
* 作为回调处理事件
|
||||
|
||||
如果存在漏洞,**Intents可以用于执行各种攻击**。
|
||||
如果存在漏洞,**Intents 可以用于执行各种攻击**。
|
||||
|
||||
### Intent-Filter
|
||||
|
||||
**Intent过滤器**定义**活动、服务或广播接收器如何与不同类型的Intents交互**。本质上,它们描述了这些组件的能力,例如它们可以执行的操作或可以处理的广播类型。声明这些过滤器的主要位置是在**AndroidManifest.xml文件**中,尽管对于广播接收器,编码它们也是一种选择。
|
||||
**Intent 过滤器**定义**活动、服务或广播接收器如何与不同类型的 Intents 交互**。本质上,它们描述了这些组件的能力,例如它们可以执行的操作或可以处理的广播类型。声明这些过滤器的主要地方是在**AndroidManifest.xml 文件**中,尽管对于广播接收器,编码它们也是一种选择。
|
||||
|
||||
Intent过滤器由类别、操作和数据过滤器组成,并可以包含附加元数据。此设置允许组件处理与声明的标准匹配的特定Intents。
|
||||
Intent 过滤器由类别、操作和数据过滤器组成,并可以包含附加元数据。此设置允许组件处理与声明的标准匹配的特定 Intents。
|
||||
|
||||
Android组件(活动/服务/内容提供者/广播接收器)的一个关键方面是它们的可见性或**公共状态**。如果组件的**`exported`**值为**`true`**,则该组件被视为公共的,可以与其他应用程序交互;如果在清单中声明了Intent过滤器,则也是如此。然而,开发人员可以通过将**`exported`**属性设置为**`false`**来显式保持这些组件私有,确保它们不会与其他应用程序意外交互。
|
||||
Android 组件(活动/服务/内容提供者/广播接收器)的一个关键方面是它们的可见性或**公共状态**。如果组件被**`exported`** 设置为 **`true`**,或者在清单中声明了 Intent 过滤器,则该组件被视为公共的,可以与其他应用程序交互。然而,开发人员可以通过将**`exported`** 属性设置为 **`false`** 来显式保持这些组件私有,确保它们不会与其他应用程序意外交互。
|
||||
|
||||
此外,开发人员还有选择进一步保护对这些组件的访问的选项,要求特定权限。**`permission`**属性可以设置为强制要求只有具有指定权限的应用程序才能访问该组件,从而增加了安全性和对谁可以与其交互的控制。
|
||||
此外,开发人员还有选择进一步保护对这些组件的访问的选项,要求特定权限。**`permission`** 属性可以设置为强制要求只有具有指定权限的应用程序才能访问该组件,从而增加了安全性和对谁可以与其交互的控制。
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
|
@ -159,7 +159,7 @@ The **Action** of the previously declared intent is **ACTION\_SEND** and the **E
|
|||
```
|
||||
一个 intent-filter 需要匹配 **action**、**data** 和 **category** 才能接收消息。
|
||||
|
||||
“Intent 解析”过程决定了哪个应用程序应该接收每个消息。该过程考虑 **priority attribute**,可以在 i**ntent-filter 声明**中设置,t**he one with the higher priority will be selected**。这个优先级可以设置在 -1000 到 1000 之间,应用程序可以使用 `SYSTEM_HIGH_PRIORITY` 值。如果出现 **conflict**,将出现一个“选择器”窗口,以便 **user can decide**。
|
||||
“Intent 解析”过程决定了哪个应用程序应该接收每个消息。这个过程考虑了 **priority attribute**,可以在 i**ntent-filter 声明**中设置,t**he one with the higher priority will be selected**。这个优先级可以设置在 -1000 到 1000 之间,应用程序可以使用 `SYSTEM_HIGH_PRIORITY` 值。如果出现 **conflict**,将出现一个“选择器”窗口,以便 **user can decide**。
|
||||
|
||||
### 显式 Intent
|
||||
|
||||
|
@ -175,15 +175,15 @@ context.startService(intent);
|
|||
```
|
||||
### Pending Intents
|
||||
|
||||
这些允许其他应用程序**代表您的应用程序采取行动**,使用您的应用程序的身份和权限。构造一个 Pending Intent 时,应该**指定一个意图和要执行的操作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),则**恶意应用程序可能会代表受害者应用程序执行声明的操作**。此外,**如果没有指定操作**,恶意应用程序将能够**代表受害者执行任何操作**。
|
||||
这些允许其他应用程序**代表您的应用程序采取行动**,使用您的应用程序的身份和权限。构造 Pending Intent 时,应该**指定一个意图和要执行的操作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),则**恶意应用程序可能会代表受害者应用程序执行声明的操作**。此外,**如果没有指定操作**,恶意应用程序将能够**代表受害者执行任何操作**。
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
与之前的意图不同,后者仅由一个应用程序接收,广播意图**可以被多个应用程序接收**。然而,从 API 版本 14 开始,可以**指定应该接收**消息的应用程序,使用 Intent.setPackage。
|
||||
|
||||
或者,在发送广播时也可以**指定权限**。接收应用程序需要具有该权限。
|
||||
另外,在发送广播时也可以**指定权限**。接收应用程序需要具有该权限。
|
||||
|
||||
广播有**两种类型**:**普通**(异步)和**有序**(同步)。**顺序**基于**接收器**元素中的**配置优先级**。**每个应用程序可以处理、转发或丢弃广播。**
|
||||
有**两种类型**的广播:**普通**(异步)和**有序**(同步)。**顺序**基于**接收器**元素中的**配置优先级**。**每个应用程序可以处理、转发或丢弃广播。**
|
||||
|
||||
可以使用 `Context` 类中的函数 `sendBroadcast(intent, receiverPermission)` 来**发送**一个**广播**。\
|
||||
您还可以使用**`LocalBroadCastManager`**中的函数**`sendBroadcast`**,确保**消息永远不会离开应用程序**。使用此方法,您甚至不需要导出接收器组件。
|
||||
|
@ -198,7 +198,7 @@ context.startService(intent);
|
|||
|
||||
## Deep links / URL schemes
|
||||
|
||||
在 Android 应用程序中,**深度链接**用于通过 URL 直接启动一个操作(Intent)。这是通过在活动中声明特定的**URL 方案**来完成的。当 Android 设备尝试**访问具有此方案的 URL**时,应用程序中的指定活动将被启动。
|
||||
在 Android 应用程序中,**深度链接**用于通过 URL 直接启动一个操作(意图)。这是通过在活动中声明特定的**URL 方案**来完成的。当 Android 设备尝试**访问具有此方案的 URL**时,应用程序中的指定活动将被启动。
|
||||
|
||||
该方案必须在**`AndroidManifest.xml`**文件中声明:
|
||||
```xml
|
||||
|
@ -212,7 +212,7 @@ context.startService(intent);
|
|||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
该示例中的方案是 `exampleapp://`(还要注意 **`category BROWSABLE`**)
|
||||
该示例中的方案是 `examplescheme://`(还要注意 **`category BROWSABLE`**)
|
||||
|
||||
然后,在数据字段中,您可以指定 **host** 和 **path**:
|
||||
```xml
|
||||
|
@ -220,7 +220,7 @@ context.startService(intent);
|
|||
android:host="example"
|
||||
/>
|
||||
```
|
||||
要从网页访问,可以设置一个链接,如:
|
||||
要从网页访问它,可以设置一个链接,如:
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
|
@ -266,7 +266,7 @@ android:host="example"
|
|||
```
|
||||
然而,从另一个应用访问一个活动并不总是安全风险。问题出现在敏感数据被不当共享时,这可能导致信息泄露。
|
||||
|
||||
活动的生命周期 **从 onCreate 方法开始**,设置用户界面并准备活动与用户进行交互。
|
||||
一个活动的生命周期 **从 onCreate 方法开始**,设置用户界面并准备活动与用户的交互。
|
||||
|
||||
### 应用程序子类
|
||||
|
||||
|
@ -296,17 +296,17 @@ super.onCreate();
|
|||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
### Broadcast Receivers
|
||||
### 广播接收器
|
||||
|
||||
**广播接收器**充当消息系统中的监听器,允许多个应用程序响应来自系统的相同消息。应用程序可以通过应用的**Manifest**或在应用代码中通过**`registerReceiver`** API**动态**注册接收器。 在Manifest中,广播通过权限进行过滤,而动态注册的接收器在注册时也可以指定权限。
|
||||
**广播接收器**充当消息系统中的监听器,允许多个应用程序响应来自系统的相同消息。应用程序可以通过应用的**Manifest**或在应用代码中通过**`registerReceiver`** API以**两种主要方式**注册接收器。在Manifest中,广播通过权限进行过滤,而动态注册的接收器在注册时也可以指定权限。
|
||||
|
||||
**意图过滤器**在这两种注册方法中都至关重要,决定哪些广播触发接收器。一旦发送匹配的广播,接收器的**`onReceive`**方法将被调用,使应用能够相应地反应,例如在低电量警报时调整行为。
|
||||
**意图过滤器**在这两种注册方法中至关重要,决定哪些广播触发接收器。一旦发送匹配的广播,接收器的**`onReceive`**方法将被调用,使应用能够相应地反应,例如在低电量警报时调整行为。
|
||||
|
||||
广播可以是**异步**的,所有接收器无序接收,或**同步**的,接收器根据设定的优先级接收广播。然而,重要的是要注意潜在的安全风险,因为任何应用都可以优先处理自己以拦截广播。
|
||||
|
||||
要理解接收器的功能,请查找其类中的**`onReceive`**方法。该方法的代码可以操纵接收到的Intent,强调接收器进行数据验证的必要性,特别是在**有序广播**中,这可能会修改或丢弃Intent。
|
||||
要理解接收器的功能,请查找其类中的**`onReceive`**方法。该方法的代码可以操作接收到的Intent,强调接收器进行数据验证的必要性,特别是在**有序广播**中,这可能会修改或丢弃Intent。
|
||||
|
||||
### Content Provider
|
||||
### 内容提供者
|
||||
|
||||
**内容提供者**对于应用之间**共享结构化数据**至关重要,强调实施**权限**以确保数据安全的重要性。它们允许应用访问来自各种来源的数据,包括数据库、文件系统或网络。特定权限,如**`readPermission`**和**`writePermission`**,对于控制访问至关重要。此外,可以通过应用的Manifest中的**`grantUriPermission`**设置授予临时访问,利用`path`、`pathPrefix`和`pathPattern`等属性进行详细的访问控制。
|
||||
|
||||
|
@ -345,7 +345,7 @@ Android 提供了两种主要的 WebView 类型:
|
|||
|
||||
一个关键点是 WebView 浏览器 **不与设备的主浏览器共享 cookies**。
|
||||
|
||||
对于加载内容,可以使用 ````loadUrl````, ````loadData````, 和 ````loadDataWithBaseURL```` 等方法。确保这些 URL 或文件是 **安全使用** 的至关重要。安全设置可以通过 ````WebSettings```` 类进行管理。例如,通过 ````setJavaScriptEnabled(false)```` 禁用 JavaScript 可以防止 XSS 攻击。
|
||||
对于加载内容,可以使用 ````loadUrl````, ````loadData````, 和 ````loadDataWithBaseURL```` 等方法。确保这些 URL 或文件是 **安全使用** 的至关重要。安全设置可以通过 ````WebSettings```` 类进行管理。例如,使用 ````setJavaScriptEnabled(false)```` 禁用 JavaScript 可以防止 XSS 攻击。
|
||||
|
||||
JavaScript "Bridge" 允许 Java 对象与 JavaScript 交互,从 Android 4.2 开始,要求方法用 ````@JavascriptInterface```` 标记以确保安全。
|
||||
|
||||
|
@ -362,7 +362,7 @@ JavaScript "Bridge" 允许 Java 对象与 JavaScript 交互,从 Android 4.2
|
|||
|
||||
### **App Verification for Enhanced Security**
|
||||
|
||||
- 从 **Android 4.2** 开始,名为 **验证应用** 的功能允许用户在安装前检查应用的安全性。此 **验证过程** 可以警告用户潜在有害的应用,甚至阻止特别恶意的应用安装,从而增强用户安全。
|
||||
- 从 **Android 4.2** 开始,名为 **验证应用** 的功能允许用户在安装前检查应用的安全性。此 **验证过程** 可以警告用户潜在有害的应用,甚至阻止特别恶意的应用安装,从而增强用户安全性。
|
||||
|
||||
### **Mobile Device Management (MDM)**
|
||||
|
||||
|
|
Loading…
Reference in a new issue