有人能帮做一个android 评论功能实现的App吗?app登录网页,获取网页信息显示出来(有报酬)

有人开发android app时遇到过某个wifi(公司)能连接到服务器,另外一个(家里)却不能的情况不? - 知乎3被浏览731分享邀请回答04 条评论分享收藏感谢收起Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布其AppLink SDK,开发者需要申请相应的资格,配置相关内容才能使用。这些都是通过用户自定义的URI scheme实现的
Android安全开发之浅谈网页打开APP
作者:伊樵,呆狐,舟海@阿里聚安全
一、网页打开APP简介
Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布其AppLink SDK,开发者需要申请相应的资格,配置相关内容才能使用。这些都是通过用户自定义的URI scheme实现的,不过背后还是Android的Intent机制。Google的官方文档一文,介绍了在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#参数;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://?load_url=。
如果在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#参数;end的形式来构造传给APP的intent数据?
这种形式的intent不会直接被Android正确解析为intent,整个scheme字符串数据可以使用Intent的getDataSting()方法获取到。
在APP中获取数据:
由上图可知Android系统自动为Custom URI scheme添加了默认的intent。
要想正确的解析,还需使用Intent的parseUri()方法对getDataString()获取到的数据进行解析,如:
3.2 风险示例
关于Intent-based URI的风险我觉得和这两篇文章写的非常好,基本把该说的都都说了,我就不多说了,大家看这两篇文章吧。
3.3 阿里聚安全对开发者建议
上面两篇文章中都给出了安全使用Intent Scheme URL的方法:
除了以上的做法,还是不要信任来自网页端的任何intent,为了安全起见,使用网页传过来的intent时,还是要进行过滤和检查。
[1] Android Intents with Chrome,
[2] Intent scheme URL attack,
[3] Android Appliaction Secure Design/Secure Coding Guidebook,
[4] Handling App Links,
[5] Android M App Links: 实现, 缺陷以及解决办法,
[6] Android Intent Scheme URLs攻击,
作者:伊樵,呆狐,舟海@阿里聚安全更多技术文章,请点击
阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
凝聚阿里巴巴多年来在无线业务安全防御的成功经验和技术成果,并面向开发者和企业提供安全扫描、应用加固、安全组件、数...
基于阿里聚安全的核心技术,为移动应用(APP)提供全生命周期的安全服务,其能够准确发现应用的安全漏洞,恶意代码,...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...查看:17937|回复:4
助理工程师
我想在用户改变某个preference后重新启动应用程序,怎么实现?Process.killProcess(Process.myPid());这个可以kill掉app,但是不能实现启动啊~怎么办??
助理工程师
试试能不能注册一个broadcastreceiver,kill前发送一个广播,在receiver里启动app
助理工程师
哪位知道啊?
Intent i = getBaseContext().getPackageManager()&&
& && &&&.getLaunchIntentForPackage(getBaseContext().getPackageName());&&
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);&&
startActivity(i);
好像可以,你试试
资深技术经理
引用:原帖由 zxcv35 于
16:42 发表
试试能不能注册一个broadcastreceiver,kill前发送一个广播,在receiver里启动app
正如上面这位午饭所说,在你kill之前可以启动一个服务,然后这个服务运行在别的进程里面。
这个服务的作用就是延迟几秒钟后启动你的应用(startActivity)。
然后你再kill你的进程,试试。通过IOS/Android App获取APP后端数据 -
| 关注黑客与极客
通过IOS/Android App获取APP后端数据
共405924人围观
,发现 10 个不明物体
本文原创作者:bt0sea
0×00、业务需求
移动应用产业以爆炸性的速度呈指数增长,但移动应用的安全问题落后于应用的发展速度。由于黑客事件变得越来越公开,对企业的影响比以往任何时候都更大。黑客渗透获取用户敏感数据后,出于商业目的销售,或者公开。所以,在移动APP端对企业数据的保护尤为重要。
P2P网站、金融等相关的网站、APP保存着用户的身份信息(真实姓名、身份证号、手机号、征信证明、银行流水等)。目前趋势是移动APP漏洞层出不穷,今天的移动安全相当于十年前web服务器安全的级别。基本上可以得出这样的结论:根据权威机构评估,平均每一个移动APP应用大约有3.5个安全漏洞,Apk 就是open source code代名词。
但是,单纯研究Mobile APP安全性问题,无法利用高危,获得服务器端的数据。所以,在分析移动APP漏洞的同时,要重点分析连接移动APP的RESTful API Web service。为什么要提RESTful API Web service呢?普通web架构+JSON不就成了么? 经过分析大部分有价值数据的网站都是使用RESTful API Web service。这是热需求。
咱们先看看哪些大咖用这种设计架构,github/fackbook等。不了解RESTful API Web Service的同学请参考:
0×01、研究手段
一、破解思路:
其实重点突破RESTful API Web Service 还是通过iOS/Android App。由于很多高大上的网站为了安全性,把Web网站和移动APP隔离,发现使用http(s)://api(OpenApi)./login/v1?phone=&sgin=022BEC9EE1B935B50DAD7B2。都是通过移动APP抓到的包。所以,我们先看看移动端安全风险主要有哪些,我们如何下手,其实OWASP Mobile Top 10 Risks给我们指引了方向:
M1:&不安全的服务器端访问控制
M2:&不安全的数据存储
M3:&传输层保护不足
M4:&非预期的数据泄露
M5:&脆弱的认证和授权
M6:&已知的弱加密算法
M7:&客户端注入
M8:&通过不被信任的输入改变安全设定
M9:&会话处理不当
M10:&缺乏二进制保护
虽然说官网总结的很好,但是对于服务器端渗透从字面上只有M1。但是个人觉得需要配合APP破解才能达到最佳效果。那么,具体应该怎么操作呢?
M1:不安全的服务器端访问控制
(1)通过android移动APP程序攻击服务器端业务逻辑。
(2)验证服务器端对输入校验。
(3)通用SQL注入 XSS跨站脚本,不安全的认证检查。
(4)通过代理方式操纵伪造数据提交。
当然要配合M2相关内容。
M2:不安全的数据存储
(1)敏感信息:用户名、密码、加密key、信用卡信息、session识别码、token等。
(2)个人信息:手机号、家庭住址、电子邮件、位置信息等。
(3)还有一些可能包含敏感信息的文件存储:SQLite databases 、Log Files 、XML Data Stores or Manifest Files 、Binary data stores 、SD Card、Cloud
??二、具体攻击方法
??2.1 使用安卓手机应用程序攻击服务器业务逻辑
通过上述分析,可以发现,如果想获取服务器端数据库的数据,主要是集中在对Web平台的安全检测,同时,结合这期的主题RESTful API Web Service,渗透测试重点主要表现在:
(1)、对手机APP客户端做身份认证(Authentication)
(2)、对手机APP身份认证之后的授权(Authorization)
(3)、对手机APP和服务器端传输的数据加密级别判定
首先,我们要了解目前的针对RESTful API Web Service防护的技术手段。
方法论研究
????1、对手机APP客户端做身份认证
1.1、在APP请求中增加签名参数
1.2、http&auth&(HTTP&Basic/HTTP&Digest)身份认证机制,这个一般都由安全架构来承担(例如Spring&Security)
1.3、OAuth&1/2协议做身份认证(一般都是第三方接入时使用,例如:weibo、微信等)
攻击思路:
寻找Android App存储在本地token信息,比如说在database、s_P等地方。
破解Android App的加固,寻找和服务器通讯URL签名算法。知道生成算法,就可以伪造请求了。。。
测试用例:撞库分析。。。(分析后可以通过已经泄露的数据库,碰撞测试):账号和密码产生机制,以及签名产生机制。
第一步:首先观察不同两次登录 URL是否存在URL签名。
POST&/filmserver/user/login&HTTP/1.1
Connection:&close
Accept-Encoding:&gzip
Content-Type:&application/x-www-form-&charset=utf-8
Content-Length:&312
Connection:&close
User-Agent:&万达电影&3.9.0&rv:95475&(iP&iPhone&OS&8.4.1;&zh_CN)
clientversion=30900&clientid=1&verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0SpI2Olm3oacqAG%252BxXBrCAm49QWQqztOFLvu5MuecuPzg%253D%253D&password=ff55bcd8bea88d1610f58&mobile=0&imei=&version=2&clienttype=1
POST&/filmserver/user/login&HTTP/1.1
Connection:&close
Accept-Encoding:&gzip
Content-Type:&application/x-www-form-&charset=utf-8
Content-Length:&308
Connection:&close
User-Agent:&万达电影&3.9.0&rv:95475&(iP&iPhone&OS&8.4.1;&zh_CN)
clientversion=30900&clientid=1&verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0TyLPqEc9hZzGdykXLBNTChe8Cq3c6zqbo2I03zxSZDbA%253D%253D&password=ff55bcd8bea88d1610f58&mobile=0&imei=&version=2&clienttype=1
发现verifycode没有改变。
第二步:分析登录各个参数的含义,同时参考破解APK文件。
POST&/filmserver/user/login&HTTP/1.1
Connection:&close
Accept-Encoding:&gzip
Content-Type:&application/x-www-form-&charset=utf-8
Content-Length:&316
Connection:&close
Cookie:&jsessionid|JSESSIONID=0f18ef079cf0f0e43281
User-Agent:&万达电影&3.9.0&rv:95475&(iP&iPhone&OS&8.4.1;&zh_CN)
clientversion=30900&
clientid=1&
verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0SrYk%252FpfqrZZAbA%252BwmJphBLFeaxqAU3tAC5Du9C9W4Yyw%253D%253D&
password=ff55bcd8bea88d1610f58&
version=2&
clienttype=1
apk破解后找到登陆处理函数。
&&public&UserAPILogin(String&paramString1,&String&paramString2,&String&paramString3,&UserModel&paramUserModel)
&&&&super(&/user/login&);
&&&&this.mMobile&=&paramString1;
&&&&this.mPassWord&=&Md5Utils.md5(paramString2);
&&&&this.mUserModel&=&paramUserM
&&&&this.mTerminal&=&paramString3;
查看源代码后,发现没有加salt,当然你可以使用MD5工具加密对比,但是绝大部分的程序是加salt的。
&&public&static&String&md5(String&paramString)
&&&&sMd5MessageDigest.reset();
&&&&sMd5MessageDigest.update(paramString.getBytes());
&&&&paramString&=&sMd5MessageDigest.digest();
&&&&sStringBuilder.setLength(0);
&&&&int&i&=&0;
&&&&for&(;;)
&&&&&&if&(i&&=&paramString.length)&{
&&&&&&&&return&sStringBuilder.toString();
&&&&&&int&j&=&paramString[i]&&&0xFF;
&&&&&&if&(j&&&16)&{
&&&&&&&&sStringBuilder.append('0');
&&&&&&sStringBuilder.append(Integer.toHexString(j));
&&&&&&i&+=&1;
在源代码中搜索verifycode、clientversion、clientid等关键字,定位到WandafilmServerAPI类中的描述:
&public&String&getUrl()
&&&&String&str&=&super.getUrl();
&&&&StringBuilder&localStringBuilder&=&new&StringBuilder();
&&&&localStringBuilder.append(str);
&&&&if&(!str.contains(&?&))&{
&&&&&&localStringBuilder.append(&?&);
&&&&for&(;;)
&&&&&&localStringBuilder.append(&clientid=&);
&&&&&&localStringBuilder.append(Integer.toString(NetConstants.CLIENT_ID));
&&&&&&localStringBuilder.append(&&clienttype=&);
&&&&&&localStringBuilder.append(Integer.toString(2));
&&&&&&localStringBuilder.append(&&verifycode=&);
&&&&&&str&=&getVerifyCodeAes(NetConstants.VERIFY_CODE&+&System.currentTimeMillis());
&&&&&&if&(!TextUtils.isEmpty(str))&{}
&&&&&&&&localStringBuilder.append(URLEncoder.encode(str.trim(),&&utf-8&));
&&&&&&&&return&localStringBuilder.toString();
&&&&&&&&localStringBuilder.append(&&&);
&&&&&&catch&(UnsupportedEncodingException&localUnsupportedEncodingException)
&&&&&&&&for&(;;)
&&&&&&&&&&localUnsupportedEncodingException.printStackTrace();
然后定位getVerifyCodeAes。
private&String&getVerifyCodeAes(String&paramString)
&&&&if&(mAes&==&null)&{}
&&&&&&mAes&=&new&EncryptionAES(NetConstants.AES_KEY);
&&&&catch&(NoSuchAlgorithmException&localNoSuchAlgorithmException)
&&&&&&for&(;;)
&&&&&&&&try
&&&&&&&&&&paramString&=&mAes.encrypt(paramString.getBytes());
&&&&&&&&&&return&paramS
&&&&&&&&catch&(InvalidKeyException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&return&
&&&&&&&&catch&(NoSuchAlgorithmException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&
&&&&&&&&catch&(NoSuchPaddingException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&
&&&&&&&&catch&(InvalidAlgorithmParameterException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&
&&&&&&&&catch&(IllegalBlockSizeException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&
&&&&&&&&catch&(BadPaddingException&paramString)
&&&&&&&&&&paramString.printStackTrace();
&&&&&&&&&&
&&&&&&&&localNoSuchAlgorithmException&=&localNoSuchAlgorithmE
&&&&&&&&localNoSuchAlgorithmException.printStackTrace();
&&&&catch&(InvalidKeySpecException&localInvalidKeySpecException)
&&&&&&for&(;;)
&&&&&&&&localInvalidKeySpecException.printStackTrace();
&&&&int&i;
&&&&if&(CURRENT_APP_SOURCE&==&AppSource.CINEMA)
&&&&&&i&=&1;
&&&&&&CLIENT_ID&=&i;
&&&&&&if&(CURRENT_APP_SOURCE&!=&AppSource.CINEMA)&{
&&&&&&&&break&label89;
&&&&&&str&=&&lhdV+wj177YyjirsxeikaNestM/YafgOxrpiGbMVxzvefarFNbQfGHXauqmTIJk+upexqehjv8xK+mlx2SbnDg==&;
&&&&&&label34:
&&&&&&VERIFY_CODE&=&
&&&&&&if&(CURRENT_APP_SOURCE&!=&AppSource.CINEMA)&{
&&&&&&&&break&label96;
&&&&label89:
&&&&label96:
&&&&for&(String&str&=&&wandayuanxian100008&;;&str&=&&wanhui20008qweasd&)
&&&&&&AES_KEY&=&
&&&&&&FACE_PACKAGE_LOCAL_PATH&=&Environment.getExternalStorageDirectory().getAbsolutePath()&+&&/WandaFacePackage&;
&&&&&&i&=&2;
&&&&&&str&=&&vcj3smUdw7H47eqDg++qQUR4P52JMZolcamSazRZAQP6h6H9C4vusOkCdt/a15ofuLwGgt+lsgCyzD+ph1WyNg==&;
&&&&&&break&label34;
&&private&byte[]&encrypt(SecretKey&paramSecretKey,&IvParameterSpec&paramIvParameterSpec,&byte[]&paramArrayOfByte)
&&&&throws&NoSuchAlgorithmException,&NoSuchPaddingException,&InvalidKeyException,&InvalidAlgorithmParameterException,&IllegalBlockSizeException,&BadPaddingException
&&&&Cipher&localCipher&=&Cipher.getInstance(&AES/CBC/PKCS7Padding&);
&&&&localCipher.init(1,&paramSecretKey,&paramIvParameterSpec);
&&&&return&localCipher.doFinal(paramArrayOfByte);
System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自日0时起的毫秒数
没有对手机唯一性的判断,那么,导致verifycode每次登陆都一样,那么,完全可以撞库。
设置8次提交。JSON数据返回值都一样({&msg&:&手机号或密码错误!&,&status&:13007}),那证明,服务器端java应用程序没有次数限制判断。
那么,具体怎么撞库,请参考:
2.2 常见的服务器端漏洞,如SQL注入
通过代理方式遍历APP抓取所有的URL连接,然后使用SQLMAP检查:
GET&/filmserver/info/popularize?verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0S1UEUY0GOe3b2gBZ6jI19NjRz%252FMbY2H1MJ%252BG%252FUT6LPPg%253D%253D&clientid=1&imei=&clientversion=30900&version=2&clienttype=1&HTTP/1.1
Connection:&keep-alive
Accept-Encoding:&gzip
User-Agent:&万达电影&3.9.0&rv:95475&(iP&iPhone&OS&8.4.1;&zh_CN)
Connection:&keep-alive
Cookie:&UID=;&SESSIONID=7d4c8ce0f904;&jsessionid|JSESSIONID=ecc029ec319c7aa
开启kali linux
开启终端:sqlmap –r sqlinj12.txt
提交的时候可以提交User-Agent:等相关参数为移动App提交,如果服务器端有相关的判断,可以绕过。
同时,建议通过wireshark观察一下返回值的情况。
经过测试发现没有sql注入漏洞。
2.3 服务器端输入验证的缺失
是否越权获取其他用户数据。
GET&/filmserver/user/userdetail?clientversion=30900&type=1&userid=&clientid=1&verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0RQz5UQQ8aiPpE15TIQiIOSUIaJWMCXwVDD5lGOpgY6gg%253D%253D&imei=&version=2&clienttype=1&HTTP/1.1
Connection:&keep-alive
Accept-Encoding:&gzip
User-Agent:&万达电影&3.9.0&rv:95475&(iP&iPhone&OS&8.4.1;&zh_CN)
Connection:&keep-alive
Cookie:&UID=;&SESSIONID=7d4c8ce0f904;&jsessionid|JSESSIONID=ecc029ec319c7aa
/filmserver/user/userdetail?
clientversion=30900&
clientid=1&
verifycode=26FZaoBW4leyKOPjrsruo%252FidC3w3S8ETmXUfiepYaAa6dwp1rqTh%252FLqFHsVxVnP8okfw%252BZaUOJ0ONHxYgOO2%252BrDmYygAmW874ZEZabzDK0RQz5UQQ8aiPpE15TIQiIOSUIaJWMCXwVDD5lGOpgY6gg%253D%253D&
version=2&
clienttype=1
&&&&((StringBuffer)localObject5).append(&UserId&);
&&&&((StringBuffer)localObject5).append(&&=?&&);
&&&&Object&localObject1&=&CinemaGlobal.getInst().mUserModel.getUser().getUid();
0×02、测试结论:
(1)不能相信任何用户的输入,服务器端必须做校验。为了防止提交URL篡改。设计URL时:建议使用用户名密码 + https + url签名(url+时间戳+随机字串)链接。服务器返回token:使用约定的AES算法secret key随机
(2)为了防止为重放攻击,请求中增加一次性的Token,或者短时间内有效的Token。需要提取用户手机特征,但是iphone最好不要提取IMEI,因为苹果权限控制,很多时候为失效状态,导致URL签名没有变化。
(3)客户端最好不要存储任何有价值的数据。存储也必须加密。因为很多时候,你无法判断你的APP是否运行在一个被root的手机上。
* 作者:bt0sea,本文属FreeBuf原创奖励计划文章,未经许可禁止转载。
看到微博跟进进来,以为你通过APP把人家裤子脱了。。唉 这傻逼应用..
必须您当前尚未登录。
必须(保密)
微信公众号:gsgsoft
关注我们 分享每日精选文章输入关键字进行搜索
如何用Android studio做一个浏览网页的小APP
这个用as还是eclipse都是差不多的。。。
http获取网页内容 然后用webview显示。
添加webview,网页地址要么写死,要么加edittext 动态获取东西才能获得。
要回复问题请先或
android studio 用户一个
浏览: 4271
关注: 3 人}

我要回帖

更多关于 android能做什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信