Android应用安全之Content Provider安全

Android安全开发之Provider组件安全 如果在AndroidManifest文件中将某个Content Provider的exported属性设置为true,则多了一个攻击该APP的攻击点。如果此Content Provider的实现有问题,则可能产生任意数据访问、SQL注入、目录遍历等风险。 阅读详情

android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序。这些数据可以存储在文件系统、SQLite数据库中,或以任何其它合理的方式存储。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。

Content Provider通过URI(统一资源定位符)来访问数据,URI可以理解为访问数据的唯一地址。

限制app对敏感Content Provider的访问

Content Provider类提供了一种机制用来管理以及与其它应用程序共享数据。在与其它应用程序共享Content Provider的数据时,应该实现访问控制,禁止对敏感数据未经授权的访问。

有三种方法来限制对内容提供者的访问:

  • 公开的
  • 私有的
  • 内部的
公开的

通过在AndroidManifest.xml文件中指定android:exported属性为true,可以设置将Content Provider公开给其它应用程序。对于API Level低于17的Android应用程序,Content Provider默认是public的,除非显式指定android:exported="false"。例如:

<provider android:exported="true" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" />

如果一个Content Provider为公开的,Content Provider中存储的数据就可以被其它应用程序访问。因此,它只能用于处理非敏感信息。

私有的

通过在AndroidManifest. xml文件中指定android:exported属性为true,可以设置将Content Provider设置为私有的。从API Level17及以后,Content Provider默认是私有的,除非显式指定android:exported="true"。例如:

<provider android:exported="false" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" />
开发建议
  1. 如果不需要与其他应用程序进行数据共享,就应该在manifest文件中设置android:exported="false"。
  2. 但是值得注意的是,在API Level低于8时,即使显式地声明了android:exported="false",其它应用程序仍然可以访问你的Content Provider。
  3. 需要向外部提供数据的content provider则需设置访问权限,如:

  下面的元素请求对用户词典的读权限:

  <uses-permission android:name="android.permission.READ_USER_DICTIONARY">

  申请某些protectionLevel="dangerous"的权限:

<uses-permission android:name="com.huawei.dbank.v7.provider.DBank.READ_DATABASE"/> 
<permission android:name="com.huawei.dbank.v7.provider.DBank.READ_DATABASE" android:protectionLevel="dangerous"></permission>

防止SQL注入

 数据查询

传递给ContentProvider的参数应该被视为不可信的,不能直接用于sql查询。 

一个程序要访问暴露的provider,首先要知道访问的目标地址,类似http协议,provider也有自己的规范,即类似content://com.aaaa.bbb.class/tablename

其中,com.aaaa.bbb为包名,class为类名,tablename为表名,一般是这样子,具体看自己定义了。

看一个查询例子:

Cursor cursor = contentResolver.query(

         Words_CONTENT_URI, new String[]{"user","pwd"},

         null, null, null);

这是调用contentResolver的query方法进行数据库查询,返回一个cursor对象,即类似DataReader的东西,里面是返回结果。

来看看query的参数

Cursor android.content.ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

uri即content://com.aaaa.bbb.class/tablename

projection即你要查询的列名

selection和selectionArgs共同控制后面的sql语句中的where内容.

sortOrder即order by xxx的内容。

那么例子中的查询整个构造的语句即:

select user,pwd from tablename;

2.Sql注入问题

综合上面的内容,我们可以看到,query里至少两个参数我们可控,一个是projection,一个是selection,这两个都会影响SQL与的组成,也就为注入提供了可能。

这里以某app为例,该app对外暴露了一个content provider,uri为:content://com.masaike.mobile.downloads/my_downloads,其中com.masaike.mobile为包名,downloads为库的名字,my_downloads为表名(不一定,可自定义的哦)。

现在语句这么写:

Cursor cursor = contentResolver.query("content://com.masaike.mobile.downloads/my_downloads", new String[]{"_id'","method"},null, null, null);

其中_id和method为两个字段名,我们在_id后面加个单引号,运行下看logcat内容:

 

从上图很容易看出来,SQL语句因为有个单引号,导致出错。所以注入是存在的。

而如果我们修改projection的内容为"* from sqlite_master where type='table';--",这样子即在闭合后面查询的情况下显示出来全部的表名。当然也可以构造其他语句了。

(参考cnrstar http://lcx.cc/?i=4462)

开发建议

1.传递给ContentProvider的参数应该被视为不可信的输入,不应该在没有经过任何处理的情况下直接用于SQL查询。如果查询语句中包含SQL代码则可以返回数据或者允许攻击者未授权地访问应用数据库的数据。

2.使用ContentProvider提供外部应用程序进行数据库存取时应使用带占位符的参数化查询防SQL注入。

3.SQLiteDatabase对象的部分内置方法是可以有效防SQL注入的,比如query(),insert(),update和delete(),另外,正确地使用rawQuery()也可以防止SQL注入,而execSQL()方法建议避免使用。

(1)、使用SQLiteDatabase对象自带的防SQL注入的方法,比如query(),insert(),update和delete():

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");

SQLiteDatabase db = dbhelper.getReadableDatabase();

/*查询操作,userInputID和userInputName是用户可控制的输入数据 */

Cursor cur = db.query("user", new String[]{"id","name"}, "id=? and name=?", new String[]{userInputID,userInputName}, null, null, null);

/* 插入记录操作*/

复制代码
ContentValues val = new ContentValues();

val.put("id", userInputID);

val.put("name", userInputName);

db.insert("user", null, val);
复制代码

/*更新记录操作*/

ContentValues val = new ContentValues();

val.put("id", userInputName);

db.update("user", val, "id=?", new String[]{userInputID });

/*删除记录操作*/

db.delete("user", "id=? and name=?", new String[]{userInputID , userInputName });

(2)、正确地使用SQLiteDatabase对象的rawQuery()方法(仅以查询为例):

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");

SQLiteDatabase db = dbhelper.getReadableDatabase();

/* userInputID和userInputName是用户可控制的输入数据*/

String[] selectionArgs = new String[]{userInputID , userInputName };

String sql = "select * from user where id=? and name=?";//正确!此处绑定变量

Cursor curALL = db.rawQuery(sql, selectionArgs);

(3)、以下为错误案例!仅供参考:

DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");

SQLiteDatabase db = dbhelper.getReadableDatabase();

/*案例1:错误地使用rawQuery(),未绑定参数*/

String sql = "select * from user where id=‘" + userInputID +"‘";//错误!动态拼接,未绑定变量

Cursor curALL = db.rawQuery(sql, null);

/*案例2:使用execSQL()方法*/

String sql = "INSERT INTO user values(‘"+userInputID +"‘,‘"+userInputName +"‘)";//错误同上

db.execSQL(sql);

4.ContentProvider支持对指定的Uri分别设置读权限和写权限,建议只开放能完成任务的最小权限。

(参考http://shikezhi.com/html/2015/android_0819/134898.html)

规范ContentProvider的url

没有正确的覆写openFile方法,导致攻击者可以通过更改访问目录,遍历系统中所有文件。

通过使用ContentProvider.openFile()方法,可以方便其它应用访问你的应用程序数据。根据ContentProvider的实现方式,使用openFile方法可以导致目录遍历漏洞。因此,当通过ContentProvider交换文件的时候,文件路径在使用之前应该被规范化。

不合规代码Example 1

在这个不合规代码示例中,试图通过调用android.net.Uri.getLastPathSegment()获取paramUri路径的最后一段,即文件名称。此文件存在于预先配置的父目录IMAGE_DIRECTORY中。

复制代码
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();

public ParcelFileDescriptor openFile(Uri paramUri, String paramString)

    throws FileNotFoundException {

  File file = new File(IMAGE_DIRECTORY, paramUri.getLastPathSegment());

  return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);

}
复制代码

然而,当这个文件路径被URL编码后,就意味着被访问的这个文件可能会存在于预配置的父目录之外的一个不可预知的目录中。

从Android 4.3.0_r2.2开始, Uri.getLastPathSegment()方法在内部调用了Uri.getPathSegments():

复制代码
public String getLastPathSegment() {

  // TODO: If we haven't parsed all of the segments already, just

  // grab the last one directly so we only allocate one string.

  List<String> segments = getPathSegments();

  int size = segments.size();

  if (size == 0) {

    return null;

  }

  return segments.get(size - 1);

}
复制代码

Uri.getPathSegments()方法的部分代码如下:

复制代码
PathSegments getPathSegments() {

  if (pathSegments != null) {

    return pathSegments;

  }

  String path = getEncoded();

  if (path == null) {

    return pathSegments = PathSegments.EMPTY;

  }

  PathSegmentsBuilder segmentBuilder = new PathSegmentsBuilder();

  int previous = 0;

  int current;

  while ((current = path.indexOf('/', previous)) > -1) {

    // This check keeps us from adding a segment if the path starts

    // '/' and an empty segment for "//".

    if (previous < current) {

      String decodedSegment = decode(path.substring(previous, current));

      segmentBuilder.add(decodedSegment);

    }

    previous = current + 1;

  }

  // Add in the final path segment.

  if (previous < path.length()) {

    segmentBuilder.add(decode(path.substring(previous)));

  }

  return pathSegments = segmentBuilder.build();

}
复制代码

Uri.getPathSegments() 方法首先通过调用getEncoded()获取了文件路径,然后使用"/"作为分隔符将路径分割成几部分,任何被编码的部分都将通过decode()方法进行URL解码。

如果文件路径被URL编码,那么分隔符就变成了"%2F",而不再是"/",getLastPathSegment()就可能不会正确地返回路径的最后一段,从而导致目录遍历漏洞的产生。

如果Uri.getPathSegments()在进行路径分割之前对路径进行解码,那么经过URL编码的路径就会被正确地处理,可惜没有这么实现。

不合规代码Example 2

在本不合规代码示例中,试图通过调用Uri.getLastPathSegment()两次来修复第一个不合规代码示例中的漏洞。第一个调用意在进行URL解码,第二个调用是用于获取开发人员需要的字符串。

复制代码
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();

  public ParcelFileDescriptor openFile(Uri paramUri, String paramString)

      throws FileNotFoundException {

    File file = new File(IMAGE_DIRECTORY, Uri.parse(paramUri.getLastPathSegment()).getLastPathSegment());

    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);

  }
复制代码

例如,当以下的URL编码字符串传递给content provider后会发生什么情况呢?

 ..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml

第一次调用Uri.getLastPathSegment()函数会返回以下字符串:

 ../../../data/data/com.example.android.app/shared_prefs/Example.xml

字符串通过Uri.parse()转换成了Uri对象, 然后作为第二次调用Uri.getLastPathSegment()函数的参数。得到的结果如下:

 Example.xml

这个字符串是用来创建一个文件对象的。然而,如果攻击者提供了一个特殊的字符串,该字符串在第一次调用Uri.getLastPathSegment()时不能被解码,那么就获取不到分割路径的最后一段。这样的字符串可以使用双重编码技术创建:

双重编码

例如,下述双重编码字符串就能绕过该漏洞修复:

%252E%252E%252F%252E%252E%252F%252E%252E%252Fdata%252Fdata%252Fcom.example.android.app%252Fshared_prefs%252FExample.xml

第一次调用Uri.getLastPathSegment() 会将 "%25" 解码为"%",得到如下字符串:

 %2E%2E%2F%2E%2E%2F%2E%2E%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml

当把这个字符串传递给第二次调用的 Uri.getLastPathSegment()时,"%2E"和"%2F" 就会被解码,得到如下字符串: 

../../../data/data/com.example.android.app/shared_prefs/Example.xml

从而导致目录遍历的可能。

仅仅通过解码字符串来防止示例中的目录遍历攻击是不够的,还必须检查解码后的路径是否在目标目录下。

PoC

以下恶意代码可对第一个不合规代码示例中的漏洞进行利用:

复制代码
String target = "content://com.example.android.sdk.imageprovider/data/" +

  "..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml"; 

ContentResolver cr = this.getContentResolver();

FileInputStream fis = (FileInputStream)cr.openInputStream(Uri.parse(target)); 

byte[] buff = new byte[fis.available()];

in.read(buff);
复制代码
PoC (Double Encoding)

以下恶意代码可对第二个不合规代码示例中的漏洞进行利用:

复制代码
String target = "content://com.example.android.sdk.imageprovider/data/" +  "%252E%252E%252F%252E%252E%252F%252E%252E%252Fdata%252Fdata%252Fcom.example.android.app%252Fshared_prefs%252FExample.xml";

ContentResolver cr = this.getContentResolver();

FileInputStream fis = (FileInputStream)cr.openInputStream(Uri.parse(target)); 

byte[] buff = new byte[fis.available()];

in.read(buff);
复制代码
 解决方案

在下述解决方案中,在使用文件路径前通过Uri.decode()对其进行了解码。同样的,在文件对象创建后,通过调用File.getCanonicalPath()将路径进行了规范,同时检查它是否存在于IMAGE_DIRECTORY目录中。

通过使用规范化后的路径,即使文件路径被双重编码,目录遍历漏洞也可以得到缓解。

复制代码
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();

  public ParcelFileDescriptor openFile(Uri paramUri, String paramString)

      throws FileNotFoundException {

    String decodedUriString = Uri.decode(paramUri.toString());

    File file = new File(IMAGE_DIRECTORY, Uri.parse(decodedUriString).getLastPathSegment());

    if (file.getCanonicalPath().indexOf(localFile.getCanonicalPath()) != 0) {

      throw new IllegalArgumentException();

    }

    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);

  }
复制代码

开发建议

ContentProvider.openFile()方法提供了一种方便其它应用程序访问自己的数据(文件)的方式,但是使用这个方法会导致一个目录遍历漏洞。因此,当通过ContentProvider访问一个文件的时候,路径应该被规范化。

1.使用ContentProvider.openFile()之前需要调用Uri.decode()

复制代码
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();

public ParcelFileDescriptor openFile(Uri paramUri, String paramString)

throws FileNotFoundException {

    String decodedUriString = Uri.decode(paramUri.toString());

    File file = new File(IMAGE_DIRECTORY, Uri.parse(decodedUriString).getLastPathSegment());

if (file.getCanonicalPath().indexOf(localFile.getCanonicalPath()) != 0) {

throw new IllegalArgumentException();

    }

return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);

  }
复制代码

2.设置exported=“false”

3.设置恰当的访问权限

 

原文地址: http://www.cnblogs.com/goodhacker/p/5249122.html

Android 四大组件之Content Provider,外部应用访问不到,原因就是如此简单 如果你遇到了Content Provider 外部应用不能访问的情况,content provider 可以帮助应用管理对自身存储或由其他应用存储的数据的访问,并提供与其他应用共享数据的方法。它们封装数据,并提供用于定义数据安全性的机制。content provider 是将一个进程中的数据与另一个进程中运行的代码连接的标准接口。实现 content provider 有诸多优势。最重要的是,您可以配置 content provider,让其他应用安全地访问和修改您的应用数据。是Android四大组件之一。 阅读详情

相关推荐

Android四大组件之内容提供器(Content Provider)

一、基本理论 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享功能,其允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。它可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不被泄露。结合Binder进程间通信机制以及匿名共享内存机制,Content Provider组件就可以高效的将它里面的数据传递给业务层中的Android应用程序访问了。 Content Provider是不是单实例由android:multiprocess属性来决定的。当该

武天旭的博客 955

Android 应用程序之间数据共享—ContentProvider

源自:http://www.moandroid.com/?p=157 在Android 应用程序之间数据共享—-ContentResolver中,已经说明了Android是如何实现应用程序之间数据共享的,并详细解析了如何获取其他应用程序共享的数据。ContentProviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。那么如何将应用程序的数据暴露

zhqingyun163的专栏 1505

深入解析Android Content Provider编程

通过Content Resolver,应用程序可以查询、插入、更新和删除Content Provider中的数据。通过Content Resolver,应用程序可以方便地调用Content Provider进行数据的查询、插入、更新和删除操作。Content Provider是Android中的一种特殊组件,用于管理应用程序中的数据,包括数据库、文件和网络资源等。除了查询数据,Content Resolver还提供了其他操作数据的方法,如插入数据、更新数据和删除数据。

2301_79326254的博客 247

Android内容提供器 contentProvider

在安卓(Android)系统中,内容提供器(Content Provider)是一个提供数据共享机制的组件,允许一个应用程序共享其数据给其他应用程序。内容提供器是应用程序间数据共享的标准接口,它为数据存取提供了一套统一的API。:内容提供器为存储在不同位置(如SQLite数据库、文件、网络等)的数据提供了一个统一的接口。其他应用程序不需要知道数据的具体存储方式和位置,只需通过内容提供器即可访问数据。

weixin_72010379的博客 621

systemView的安装使用

systemView的安装使用

qq_33712422的博客 3956

Foxglove 介绍以及入门使用教程

Foxglove 是由Foxglove 工作室开发的一套工具集,包括和等组件。跨平台支持:可以在 Windows、macOS 和 Linux 上运行。多协议兼容:支持 ROS、ROS 2、CAN 数据以及其他自定义协议。丰富的可视化功能:可以绘制点云、轨迹、激光雷达数据、IMU 数据等。实时与离线模式:既可以实时监控机器人状态,也可以加载和回放记录的数据文件。Foxglove 的 3D 视图允许你以三维方式查看机器人的运动轨迹、传感器数据和其他几何信息。你可以旋转、缩放和平移视图以获得更好的观察角度。

zolty 1万+

Uri的getPathSegments()方法。

Uri的getPathSegments()方法返回的是一个元素为String的List,每个元素都是从Uri截取出来的一部分。(segment的意思就是“部分,段”)。下标从零开始。比如有如下URI: 1 Uri uri = Uri.parse("content://com.haha.mycontentproviderdemo.NoteContentProvider/notes"); ...

weixin_30394633的博客 1092

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

安卓安全——读书笔记

想到什么就随手写点吧,最近刚看完《Android软件安全与逆向分析》。 另外还有一本《Android应用安全防护和逆向分析》,准备开始看。两本书的PDF链接我会放在末尾,需要的自取。 《Android软件安全与逆向分析》书中提到了多种去除Android本地限制的方法,倾向于基础性的安卓破解,比如去内购(不过本书的内购都是围绕着google play来讲的,和国内的内购相差很大,国内的话更...

zhalang8324的博客 818

使用 git一个仓库管理多个项目

我们需要在 git 里面创建一个空分支,该分支不继承任何提交,没有父节点,完全是一个干净的分支,这时候就需要使用 orphan。该命令会创建一个新的分支,并且该分支有前一个分支下的所有文件,我们不想提交任何内容,所以我们需要把当前内容全部删除。此时 master 分支已经有一个项目了,下面我们创建新的分支管理另一个项目。此时可以在该分支目录上初始化你的项目,在执行 git 命令提交代码。此时我们就完成了在同一个仓库管理不同项目的需求了。下载仓库到本地之后,进入项目目录,查看分支信息。

xrs151的博客 2025

IEEE Access投稿全流程:从LaTeX模板到Overleaf实战(附避坑指南)

本文详细解析了向IEEE Access期刊投稿的完整流程,重点介绍了如何使用LaTeX模板在Overleaf平台上高效撰写和格式化论文。内容涵盖模板选择、作者信息填写、公式图表排版、参考文献管理(BibTeX)以及投稿前的最终检查清单,旨在帮助研究者,尤其是LaTeX新手,规避常见技术问题,顺利完成符合期刊严格要求的稿件提交。

open4的博客 574

Android车载应用实现与其他应用程序的交互

在Android Automotive OS或Android Auto环境中,应用间交互需要遵循特定的限制和安全规范,同时要考虑驾驶场景下的安全性。

斗锋在干嘛的博客 496

Light Tools 8.4 在 win10系统上的安装方法(64位)

** 总的来说安装LT需要以下步骤(折腾了三天终于装好): 安装LT软件–禁用签名–加载含数字签名的第三方inf–添加注册表/安装驱动/添加密钥–成功破解 一、下载对应的LightTools 8.4版本软件,如下图为解压后的文件: 并选择 进行默认安装。 二、禁用数字签名。这里我用了两种方法,一种不行就换另一种,最终成功禁用。 方法1: 1、输入“cmd”并以管理员身份运行; 2、输入或复制 bcdedit.exe /set nointegritychecks on (此命令若没成功,再试bcded

weixin_45560953的博客 1万+

Drozer安卓安全评估框架:从环境搭建到实战漏洞挖掘

在移动应用安全领域,Android应用的安全评估是保障用户数据和隐私的关键环节。其核心原理在于通过动态分析技术,模拟攻击者视角,深入应用内部上下文进行渗透测试,以发现静态分析难以触及的漏洞。这项技术的核心价值在于能够有效识别权限滥用、数据泄露和组件暴露等高风险安全问题,广泛应用于移动应用安全审计、开发者自测和合规性检查等场景。本文聚焦于业界广泛使用的Drozer框架,这是一个功能强大的Android安全评估工具,它通过安装代理应用(Agent)并与控制台(Console)交互,实现对四大组件(Activit

weixin_33735077的博客 330

NE564锁相环FM解调电路设计:10.7MHz中频实测与3种失真优化方案

本文详细解析了NE564锁相环在10.7MHz中频FM解调电路中的设计与优化方案。通过分析锁相环技术基础、电路架构设计及典型失真问题,提供了3种有效的失真优化方法,包括限幅增强、VCO频偏补偿和环路滤波优化,显著提升解调性能。文章还涵盖了PCB布局要点和系统测试验证,为高频电子线路设计提供实用参考。

weixin_33314040的博客 349

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 544

Android学习之Provider

创建 Content Provider 类继承AUTHORITY) : Cursor?) : Uri?): Uri?context?) : Cursor?) : Uri?) : Uri?) : Int {

m0_69682018的博客 1016

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

3-6安卓中的Content Provider组件

​继承与重写方法​需继承ContentProvider类并实现以下核心方法:java@Overridepublic boolean onCreate() { /* 初始化数据库等操作/ }@Override查询逻辑 */ }// 重写insert、update、delete、getType方法getType():返回MIME类型(如vnd.android.cursor.dir/user表示多行数据)。​注册Provider​。

weixin_45530192的博客 1437

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

小白也能懂:Android的content://协议详解

content://是Android系统中一种特殊的URI协议,主要用于访问由内容提供者(Content Provider)管理的数据。和常见的http://、file://不同,它专门用于Android应用程序之间的安全数据共享。

CrystalwaveStag的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

安卓利用inten获取图片数据和Content Provider获取图片数据的区别?

对比项Intent核心机制组件通信,依赖用户交互数据共享,直接访问系统数据库典型场景用户手动选图应用主动遍历图库数据获取需解析返回的Uri直接查询MediaStore权限要求动态申请同上代码复杂度需处理多版本Uri兼容需熟悉数据库结构选择建议若需用户主动选择图片,用Intent;若需批量获取图库数据,用Content Provider。

小新的博客 858

Android安全测试框架Drozer(使用篇)

一、运行APP 在模拟器中运行drozer Agent App,并打开Embbdded Server。 二、ADB查看模拟器 打开命令行工具,并cd切换到安卓模拟器的安装路径D:\Program Files\Microvirt\MEmu,运行adb devices命令,查看是否能看到模拟器。如果看不到,重启模拟器试试。 三、进入Drozer控制台 使用 adb 进行端口转发,转发到上边Drozer使用的端口 31415,并进入Drozer 控制台: adb forward tcp:314.

键盘的起始页 3869

android sqlite provider,android - “Content-Provider”和“SQLite数据库”之间的确切区别...

android - “Content-Provider”和“SQLite数据库”之间的确切区别我已经为Android完成了SQLite数据库编程,但我对此一无所知内容提供商除此之外:“正如我已经提到Android开发者页面,Android SDK解释了”内容提供商“,因为它用于存储和检索数据。”但是之后,“Content-Provider”和“SQLite数据库”之间的确切区别是什么?什么时候最...

weixin_35985796的博客 405

安卓Content Provide(内容提供者)

安卓四大组件之内容提供者Content ProvideContentProvide是什么使用Content Provide读取和操作相应程序中的数据获取ContentResolver类实例使用ContentResolver中的一系列方法进行增删改查程序中创建自己的Content Provide,给其他程序提供外部访问接口 ContentProvide是什么 ContentProvide用于实现程序之间的数据共享,提供一整套完整的机制,允许访问其他程序的数据(前提是目标程序提供外部访问的接口),同时保证被访问

qq_44356236的博客 714

Android 官方文档学习笔记(1):Androiid以及相关应用组件概念

Android SDK介绍: Android SDK 会将应用内容打包成一个.apk后缀的文件(包括了逻辑代码,应用所需要的资源文件)。对于Android应用系统,就一多用户的Linux系统,所有的应用都在该系统下的一个用户,每一应用会被系统分配一个唯一的ID。因此不同的应用都要自己的资源和进程。 Android对应用的数据保护(安全沙盒)有以下约束: 每一个应用由于都有自己的唯一id,因此除了人为将多个应用设置同一id情况下,不然应用不能访问彼此的资源。 每一个应用都有自己的进程和虚拟机,因此在需要运行

qq_33583900的博客 488
上一篇: Shellcode Injection
下一篇: 管家病毒查杀模块逆向分析
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值