问题的引出

说到SQL注入,我们常说不使用字符串拼接,使用带占位符的参数化查询可以防SQL注入,那么,在Android content provider中是否也一样呢?下面我们来看一段android contentprovider中的数据库查询代码示例:

public void showBooks(View view) {

String content = "";

Uri bookUri = BookProvider.BOOK_CONTENT_URI;

String _id = "3";

String name = "Android";

Cursor bookCursor = getContentResolver().query(bookUri, new String[]{"_id", "name"}, "_id=? and name=?",

new String[] {_id, name}, null, null);

if (bookCursor != null) {

while (bookCursor.moveToNext()) {

Book book = new Book();

book.bookId = bookCursor.getInt(0);

book.bookName = bookCursor.getString(1);

content += book.toString() + "\n";

Log.e(TAG, "query book: " + book.toString());

mTvShowBooks.setText(content);

}

bookCursor.close();

}

}

其中的查询语句用sql语句表示为:

select _id,name from book where _id= ? and name = ?

理论上,这条语句是不应该存在sql注入的。但是,当使用如下drozer命令对selection进行注入时,发现是存在SQL注入的:

run app.provider.query content://org.vivo.book.provider/book --projection "'"

我们在代码中已经对selection参数使用了带占位符的参数化查询了,怎么还存在SQL注入呢?

仔细查看上图报错信息发现SQL语句变成了“select * from book where ‘”,查询条件已经变成我们输入的“’”单引号了。所以我们猜想,这里的SQL注入其实跟web sql注入不太相同。这里是直接将用户输入替代了原来的SQL语句,而不是简单的替换某个查询变量。为了验证这个猜想,我们分析了drozer的源代码。Drozer在执行上述SQL注入命令时,会解析输入的相应参数,然后调用下图中的query函数进行查询操作。

为了验证前面的猜想,我们在代码中添加打印语句,打印projection、selection等参数信息,再执行drozer命令,发现查询语句确实被替换了。

run app.provider.query content://org.vivo.book.provider/book --selection "1=1"

run app.provider.query content://org.vivo.book.provider/book --projection "1=1"

所以,不管我们怎么实现查询,只要有权限读取contentprovider uri,就可以实现SQL注入。

run app.provider.query content://org.vivo.book.provider/book/ --projection "* FROM sqlite_master --;"

我们的sql查询语句的结构通常如下:

SELECT [projection] FROM [table] WHERE [select clause]

需要注意的是,这里不仅select clause存在SQL注入情况,projection也会存在注入。

ContentProvider允许用户任意指定他们想要检索的projection,外部应用程序可以通过请求任意projection从中查询数据,如:

'Bobby Tables was here'; DROP TABLE Students; --

* FROM sqlite_master; --

* FROM non_public_table_I_found_out_about_using_previous_query; --

这就意味着,如果ContentProvider的某个uri暴露了,并且没有对projection参数进行过滤就带入查询的话,你的整个数据库就会暴露在外。

在导出的 ContentProviders 中实现 query、update 和 delete 时,如果将未经处理的输入传递给 SQL 语句,就会容易受到 SQL 注入攻击。恶意应用可能会提供蓄意创建的输入,进而访问隐私数据或损坏数据库内容。您可以通过以下方式解决此问题:

如果受影响的 ContentProvider 无需供其他应用使用,请执行以下操作:

您可以在清单中修改受影响的 ContentProvider 的 标记,以便设置 android:exported="false"。这样可以阻止其他应用将 Intent 发送到受影响的 ContentProvider。

您还可以设置 android:permission 属性,将 permission 设为 android:protectionLevel="signature",从而阻止其他开发者编写的应用将 Intent 发送到受影响的 ContentProvider。

如果受影响的 ContentProvider 需要供其他应用使用,请执行以下操作:

您可以通过结合使用严格模式和投影映射来防止 SQLiteDatabase.query 受到 SQL 注入攻击。严格模式可防止出现恶意选择子句,投影映射可防止出现恶意投影子句。您必须同时使用这两项功能来确保查询安全无虞。

代码示例:

private static HashMap values = new HashMap<>();

// 关联Uri和Uri_Code

static {

sUriMatcher.addURI(AUTHORITY, "book", BOOK_URI_CODE);

sUriMatcher.addURI(AUTHORITY, "user", USER_URI_CODE);

values.put("_id", "_id");

values.put("name", "name");

}

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

qb.setTables(getTableName(uri));

qb.setStrict(true);

switch (sUriMatcher.match(uri)) {

case BOOK_URI_CODE:

qb.setProjectionMap(values);

break;

default:

break;

}

Cursor cursor = qb.query(mDb,

projection,

selection,

selectionArgs,

null,

null,

sortOrder);

return cursor;

}

您可以通过以下方式来防止 SQLiteDatabase.update 和 SQLiteDatabase.delete 受到 SQL 注入攻击:使用以“?”作为可替换参数的选择子句,并使用一组单独的选择参数。不应使用不信任的输入构建选择子句。

参考文档:

https://support.google.com/faqs/answer/7668308

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[关于Android contentprovider sql注入问题]http://www.zyiz.net/tech/detail-99678.html

Android游戏SQL注入,关于Android contentprovider sql注入问题相关推荐

  1. ios和android游戏平台,iOS和Android平台上的10款益智游戏

    闲来会玩儿几把填字或数独游戏吗?尽管有趣,其实这类脑筋急转弯游戏很单调.鉴于它们的可移植性,我们的智能手机和平板电脑才能成为可以装在口袋中的智力健身器.另外,益智类应用有趣的界面.游戏特性.触控控制方 ...

  2. Android游戏帧分析工具,android性能跟踪分析工具系列 - TraceView

    37624124_1408459493746.jpg 文集目录 话说前2篇都是介绍查看app 每帧的渲染,根据不同任务耗时离来查找问题,那么我们现在可以发现 app 卡顿是由哪个任务区域造成的,然后呢 ...

  3. 技术转载:八款开源 Android 游戏引擎 (巨好的资源)

    作者: iamsheldon 链接:http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/ 初学Android游戏开发的朋友,往往会显得 ...

  4. 八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...

  5. 八款开源Android游戏引擎

    导读:很多初学Android游戏开发的朋友,往往会羡慕iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,事实上,Android也有相当数量的游戏引擎存在.下面我罗列出八款常见 ...

  6. 《Android游戏编程入门经典》——1.7节小结

    本节书摘来自异步社区<Android游戏编程入门经典>一书中的第1章,第1.7节小结,作者[美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区&q ...

  7. Android 游戏引擎汇总

    Android 游戏引擎汇总 1.AndEngine 简介:AndEngine 基于libGDX框架开发,使用OpenGL ES进行图形绘制.同时继承了BOX2D物理引擎,因此能实现一些较为复杂的物理 ...

  8. 八款开源Android 游戏引擎介绍

    http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/?cid=sw:prccsdn2138 初学Android游戏开发的朋友,往往会显 ...

  9. 为什么没有好用的Android游戏引擎?

    为什么没有好用的Android游戏引擎? 随着Android平台的不断发展,近期Android开发者数量呈现出上升势头,就连以往较为冷门的游戏开发领域也涌现出不少生力军.然而,全新的问题正摆在了初学者 ...

  10. Android 游戏破解

    这几天, 学习android 游戏的, 发现android程序基本上都是可以解包的. 很多游戏的素材都是没有加密的,也有一些加密的, 比如 <千炮捕鱼><放开那三国> 他们的素 ...

最新文章

  1. cookie、localStorage和sessionStorage区别
  2. 请在请求中携带deviceid参数_实战SpringCloud通用请求字段拦截处理
  3. DataGrip 连接 Hive
  4. html怎么无损插入背景音乐,HTML插入背景音乐方法【全】
  5. 【原创】Erlang 之 match 和 compare equal
  6. python股票接口_Python 从 sina 股票数据接口读取数据,并保存到 MySQL 数据库
  7. mysql genlog 分析_使用mysqlsla 分析 mysql logs
  8. Kotlin-高阶函数
  9. 列出各部门的最低工资MySQL_mysql练习题五
  10. PowerBI数据分析之Power BI Desktop数据整理
  11. C语言课设-单位车辆调度管理
  12. 学习阿里代码规范笔记
  13. ubuntu18.04鼠标正常使用,而键盘失灵
  14. Tomcat调优总结【内存和线程】
  15. 美丽天天秒系统开发模式与美丽天天秒系统源码分享
  16. Springboot毕设项目扶贫管理系统p8k44(java+VUE+Mybatis+Maven+Mysql)
  17. Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data
  18. macbook移动文件
  19. mysql左连接多条件,on子句多条件
  20. 七月就业班强势来袭~

热门文章

  1. 【三维路径规划】基于matlab A_star算法机器人栅格地图三维路径规划【含Matlab源码 190期】
  2. 【情感识别】基于matlab支持向量机(SVM)语音情感识别【含Matlab源码 543期】
  3. python3 相对路径导入_Python中相对路径(导入)和绝对路径(导入)的区别
  4. excel二极管伏安特性曲线_【电子知识点】半导体二极管amp;三极管
  5. heroku_如何通过5个步骤在Heroku上部署机器学习UI
  6. php多条件查询统计,PHP-----多条件查询
  7. matlab 流水灯,Matlab生成stm32代码
  8. php 上楼梯问题 递归,算法:爬楼梯问题中的递归
  9. 电压转换速率(Slew Rate,SR)
  10. idea 调节背景护眼_网易严选皓月护眼台灯评测:真正专业智能台灯,保护眼睛设计超强...