Android中是怎样防止SQL注入的?
答案:5 悬赏:30 手机版
解决时间 2021-02-21 18:05
- 提问者网友:感性作祟
- 2021-02-21 14:45
在JavaWeb中有PreparedStatement可以防止SQL注入,但是在android中有没有类似的功能呢?现在要做一个查找的功能,将本地SQLite数据库中的带有%的字段查找出来,如果我使用 字段 like "%"会直接将所有的结果都打印出来了,这是不对的。应该是输出带有%的字段,而不是打印所有字段
最佳答案
- 五星知识达人网友:十鸦
- 2021-02-21 14:57
1. Android中的数据多是存储在Sqlite数据库中,这个文件一般在手机的系统路径如:/data/data/com.xx.yy/databases/zzz.db。其中com.xx.yy为包名。zzz.db名字随意,为数据库文件
2. 在安卓应用程序中,有一个非常重要的组件,即“content provider”
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据
3.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';--",这样子即在闭合后面查询的情况下显示出来全部的表名。当然也可以构造其他语句了。
2. 在安卓应用程序中,有一个非常重要的组件,即“content provider”
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据
3.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';--",这样子即在闭合后面查询的情况下显示出来全部的表名。当然也可以构造其他语句了。
全部回答
- 1楼网友:持酒劝斜阳
- 2021-02-21 17:48
安卓系统相当于linux 获取了root相当于获取管理员权限 SQL的注入是需要管理员权限许可才可执行,否则不可
- 2楼网友:何以畏孤独
- 2021-02-21 17:20
COPY过来有什么意思。。。。。。。 ----------------------------- 要防止SQL注入其实不难,你知道原理就可以了。 所有的SQL注入都是从用户的输入开始的。如果你对所有用户输入进行了判定和过滤,就可以防止SQL注入了。用户输入有好几种,我就说说常见的吧。 文本框、地址栏里***.asp?中?号后面的id=1之类的、单选框等等。一般SQL注入都用地址栏里的。。。。如果要说怎么注入我想我就和上面的这位“仁兄”一样的了。 你只要知道解决对吗? 对于所有从上一页传递过来的参数,包括request.form 、request.qurrystring等等进行过滤和修改。如最常的***.asp?id=123 ,我们的ID只是用来对应从select 里的ID,而这ID一般对应的是一个数据项的唯一值,而且是数字型的。这样,我们只需把ID的值进行判定,就可以了...
- 3楼网友:轻熟杀无赦
- 2021-02-21 16:26
1. android里也有参数化查询的, 可防止SQL 注入2. select * from table1 where col1 like '%\%%' ESCAPE '\';
- 4楼网友:迷人又混蛋
- 2021-02-21 15:18
建辉 (建造辉煌成就)
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯