Android应用安全开发之浅谈网页打开APP

一、网页打开APP简介

Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布其AppLink SDK,开发者需要申请相应的资格,配置相关内容才能使用。这些都是通过用户自定义的URI scheme实现的,不过背后还是Android的Intent机制。Google的官方文档《Android Intents with Chrome》一文,介绍了在Android Chrome浏览器中网页打开APP的两种方法,一种是用户自定义的URI scheme(Custom URI scheme),另一种是“intent:”语法(Intent-based URI)。

 

第一种用户自定义的URI scheme形式如下:

 

第二种的Intent-based URI的语法形式如下:

因为第二种形式大体是第一种形式的特例,所以很多文章又将第二种形式叫Intent Scheme URL,但是在Google的官方文档并没有这样的说法。

 

注意:使用Custom URI scheme给APP传递数据,只能使用相关参数来传递数据,不能想当然的使用scheme://host#intent;参数;end的形式来构造传给APP的intent数据。详见3.1节的说明。

此外,还必须在APP的Androidmanifest文件中配置相关的选项才能产生网页打开APP的效果,具体在下面讲。

 

二、Custom Scheme URI打开APP

2.1 基本用法

需求:使用网页打开一个APP,并通过URL的参数给APP传递一些数据。 

如自定义的Scheme为:

注意: uri要用UTF-8编码和URI编码。

 

网页端的写法如下:

 

APP端接收来自网页信息的Activity,要在Androidmanifest.xml文件中Activity的intent-filter中声明相应action、category和data的scheme等。 

如在MainActivity中接收从网页来的信息,其在AndroidManifest.xml中的内容如下:

 

在MainActivity中接收intent并且获取相应参数的代码:

另外还有以下几个API来获取相关信息: 

getIntent().getScheme(); //获得Scheme名称 

getIntent().getDataString(); //获得Uri全部路径 

getIntent().getHost(); //获得host

 

2.2 风险示例

常见的用法是在APP获取到来自网页的数据后,重新生成一个intent,然后发送给别的组件使用这些数据。比如使用Webview相关的Activity来加载一个来自网页的url,如果此url来自url scheme中的参数,如:jaq://jaq.alibaba.com?load_url=http://www.taobao.com。

 

如果在APP中,没有检查获取到的load_url的值,攻击者可以构造钓鱼网站,诱导用户点击加载,就可以盗取用户信息。

 

接2.1的示例,新建一个WebviewActivity组件,从intent里面获取load_url,然后使用Webview加载url:

 

修改MainActivity组件,从网页端的URL中获取load_url参数的值,生成新的intent,并传给WebviewActivity:

 

网页端:

 

钓鱼页面:

 

点击“打开钓鱼网站”,进入APP,并且APP加载了钓鱼网站:

 

本例建议: 

在Webview加载load_url时,结合APP的自身业务采用白名单机制过滤网页端传过来的数据,黑名单容易被绕过。

 

2.3 阿里聚安全对开发者建议

1、APP中任何接收外部输入数据的地方都是潜在的攻击点,过滤检查来自网页的参数。

 

2、不要通过网页传输敏感信息,有的网站为了引导已经登录的用户到APP上使用,会使用脚本动态的生成URL Scheme的参数,其中包括了用户名、密码或者登录态token等敏感信息,让用户打开APP直接就登录了。恶意应用也可以注册相同的URL Sechme来截取这些敏感信息。Android系统会让用户选择使用哪个应用打开链接,但是如果用户不注意,就会使用恶意应用打开,导致敏感信息泄露或者其他风险。

 

三、Intent-based URI打开APP

3.1基本用法

Intent-based URI语法:

 

注意:第二个Intent的第一个字母一定要大写,不然不会成功调用APP。

 

如何正确快速的构造网页端的intent? 

可以先建个Android demo app,按正常的方法构造自己想打开某个组件的Intent对象,然后使用Intent的toUri()方法,会得到Intent对象的Uri字符串表示,并且已经用UTF-8和Uri编码好,直接复制放到网页端即可,切记前面要加上“intent:”。 

 

如:

 

结果:

S.load_url是跟的是intent对象的putExtra()方法中的数据。其他类型的数据可以一个个试。如果在demo中的Intent对象不能传递给目标APP的Activity或其他组件,则其Uri形式放在网页端也不可能打开APP的,这样写个demo容易排查错误。

 

APP端中的Androidmanifest.xml的声明写法同2.1节中的APP端写法完全一样。对于接收到的uri形式的intent,一般使用Intent的parseUri()方法来解析产生新的intent对象,如果处理不当会产生Intent Scheme URL攻击。

 

为何不能用scheme://host#intent;参数;end的形式来构造传给APP的intent数据? 

这种形式的intent不会直接被Android正确解析为intent,整个scheme字符串数据可以使用Intent的getDataSting()方法获取到。 

如对于:

 

在APP中获取数据:

 

结果是:

 

由上图可知Android系统自动为Custom URI scheme添加了默认的intent。 

 

要想正确的解析,还需使用Intent的parseUri()方法对getDataString()获取到的数据进行解析,如:

 

3.2 风险示例

关于Intent-based URI的风险我觉得《Android Intent Scheme URLs攻击》和《Intent Scheme URL attack》这两篇文章写的非常好,基本把该说的都都说了,我就不多说了,大家看这两篇文章吧。

 

3.3 阿里聚安全对开发者建议

上面两篇文章中都给出了安全使用Intent Scheme URL的方法:

 

除了以上的做法,还是不要信任来自网页端的任何intent,为了安全起见,使用网页传过来的intent时,还是要进行过滤和检查。

 

四、参考

[1] Android Intents with Chrome,https://developer.chrome.com/multidevice/android/intents 

[2] Intent scheme URL attack,http://drops.wooyun.org/papers/2893 

[3] Android Appliaction Secure Design/Secure Coding Guidebook,http://www.jssec.org/dl/android_securecoding_en.pdf 

[4] Handling App Links,http://developer.android.com/intl/zh-cn/training/app-links/index.html 

[5] Android M App Links: 实现, 缺陷以及解决办法,http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0718/3200.html 

[6] Android Intent Scheme URLs攻击,http://blog.csdn.net/l173864930/article/details/36951805

 

转载于:https://www.cnblogs.com/android-blogs/p/5420336.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python history文件_【python之路19】文件操作

一、打开文件文件句柄 open(文件路径, 模式)打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。打开文件的模式有:r ,只读模式【默认】w&…

php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...

发布图片最多可添加9张作品发布wx.config({debug: false,appId: {$signPackage["appid"]},timestamp: {$signPackage["timestamp"]},nonceStr: {$signPackage["noncestr"]},signature: {$signPackage["signature"]},jsApiList: [// 所…

2、在控制台上输出1—100数字

public class Test {// 定义类 public static void main(String[] args) {// 主函数&#xff0c;程序的入口 for (int i 1; i < 100; i) { System.out.print(i " "); } }}转载于:htt…

vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?

JavaScript 的节流和防抖已经是老生畅谈的问题了&#xff0c;对于前端行业技术大牛来讲不过是小菜一碟&#xff0c;而对于绝大多数前端小白或初级工程师&#xff0c;绝对是必备的知识&#xff0c;值得学习。接下来小郭就带大家一起学习“防抖”与“节流”。防抖不知道大家第一次…

php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...

php 与 JavaScript 有很多相似的地方&#xff1b; for循环中也有两个相同&#xff1b; 只是 php 比 js 多了一个 exit &#xff0c; 其他用法一样&#xff1b;for($i 1;$i<11;$i){if($i3){// exit; //当$i 3 代码停止运行&#xff0c;包括循环外的&#xff0c;后面的也停止运…

checkbox:全选与反全选

$(document).ready(function () {//全选checkbox$("#selectAll").click(function () {var checked $(this).prop("checked");$(":checkbox").prop("checked", checked);});$("tbody :checkbox").click(function () {var is…

python连接influxdb_python 访问 InfluxDB 数据库

我们开发了一个基于 TelegrapgInfluxDBchonographkapacitor 的气象站监控演示系统。通过modular-2 连接了一个气象站传感器&#xff0c;采集温度&#xff0c;湿度&#xff0c;PM2.5&#xff0c;PM1.0 &#xff0c;照度&#xff0c;大气压等参数。通过MQTT 协议传送给Telegraph。…

location php,Nginx服务器中的location配置详解

语法location [|~|~*|^~] /uri/ {...}规则 &#xff1a; 表示精确的URI匹配(有兴趣的同学可以看一下url和uri的区别)&#xff5e;&#xff1a; 表示区分大小写的正则匹配&#xff5e;*&#xff1a;表示不区分大小写的正则匹配!~ && !~*&#xff1a;表示区分大小写不匹…

codevs4203山区建小学

/* 状态&#xff1a;f[i][j] 前i个村庄已经建了j个学校 转移&#xff1a;f[i][j]min&#xff08;f[i][j],f[ii][j-1]s[ii1][i]&#xff09; 1<ii<i-1 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include &l…

gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy

关于 Gson 解析JSON数据。。。1.首先&#xff0c;我是从服务器端传回来的JSON数据如下&#xff1a;{"info":"succeed","user_id":"1","user_password":"9999","user_email":"95469qq.com",&q…

android安装python opencv_Python、C++、Android OpenCV 开发环境的配置

在 Mac 上折腾了一下 OpenCV 的配置&#xff0c;分别配置了 Python 、C 和 Android 上的开发环境&#xff0c;中间还遇到点坑&#xff0c;简要记录一下。OpenCV 的安装OpenCV 的安装有两种方式&#xff0c;可以通过下载源码自行编译&#xff0c;也可以通过homebrew来安装。源码…

如何防止用户重复提交表单

我们提交表单的时候&#xff0c;不能忽视的一个限制是防止用户重复提交表单&#xff0c;因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据&#xff0c;那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。那么如何规避这中重复提交表单的现象出现呢…

java要频繁调用容器时_Java知识点梳理

1、Struts2和SpringMVC的区别(1)设计理念&#xff1a;前者为有状态的Action(均为多例)&#xff0c;Action对象属性字段承载请求、响应&#xff0c;后者一般为无状态的Controller&#xff0c;请求直接封装到方法的参数中&#xff1b;(2)集中访问点不同&#xff1a;都属于前端控制…

基于busybox的Linux小系统制作 (initrd)

我们有时候有需要在busybox基础上&#xff0c;制作linux&#xff0c;可是却不知道具体怎么做&#xff0c;这里将对基于busybox的linux小系统制作做出详细的步骤说明。准备环境&#xff1a;1、一个Redhat完整系统的虚拟机&#xff0c;本次实例使用的是Redhat Enterprise Linux 5…

Java异常持久化,Log4j进行日志的数据库持久化,说SQL语法异常。

Log4j进行日志的数据库持久化&#xff0c;说SQL语法错误。。。在properties的配置中。。。。log4j.appender.db org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.db.BufferSize1log4j.appender.db.drivercom.mysql.jdbc.Driverlog4j.appender.db.URLjdbc:mysql://localhost…

实现光晕效果_马自达6车灯升级激光四透镜实现四近四远光

汽车前照明大灯升级案例车型&#xff1a;马自达6灯泡色温&#xff1a;5600K透镜案例&#xff1a;米石激光 TMF激光原车灯泡型号&#xff1a;H1 H1雾灯&#xff1a;H3原车瓦数&#xff1a;80-100W升级方式&#xff1a;支架安装方式&#xff1a;有密封胶性质&#xff1a;热LED解码…

我使用的Chrome插件列表

AdBlock 用来屏蔽广告的&#xff0c;有一些网站会探测出你在使用AdBlock。如果一定要继续浏览的话&#xff0c;你可能需要暂停一下AdBlock Vimium 非常推荐喜欢vim的用户试试看这款插件&#xff0c;它的主要特色是用类vim快捷键来管理chrome的常用操作&#xff0c;比如标签页的…

matlab欧拉法程序,欧拉法matlab程序.doc

欧拉法matlab程序.doc 1.Euler法function[x,y]naeuler(dyfun,xspan,y0,h)xxspan(1):h:xspan(2);y(1)y0;forn1:length(x)-1y(n1)y(n)h*f(dyfun,x(n),y(n));endxx ;yy ;x10:0.2:1;y1(12*x1).^0.5;plot(x,y,x1,y1)>>dyfuninline( y-2*x/y );[x,y]naeuler(dyfun,[0,1],1,0.2)…

python对平面设计帮助_平面设计工作心得

..平面设计工作心得平面设计工作心得为大家整理作为公司一名平面设计对自己基本工作情况的感受&#xff0c;对公司工作环境&#xff0c;公司领导&#xff0c;同事相处以及自己的本职工作的体会&#xff0c;下面是平面设计工作心得平面设计工作心得来到公司已经快两个月了。感觉…

python string与list互转

因为python的read和write方法的操作对象都是string。而操作二进制的时候会把string转换成list进行解析&#xff0c;解析后重新写入文件的时候&#xff0c;还得转换成string。 >>> import string >>> str abcde >>> list list(str) >>> l…