如何防止薅羊毛,一直是App头疼且需要注意的问题,前端能做到真正的防黑产吗?答案是否定的,也就是说,通过前台,我们是无法知道当前用户是否是真实用户的,毕竟Android是不安全的,可以模拟用户的一系列操作手势,也可以通过抓取相应的接口,模拟相应的请求,一个黑产想要达到他想要的目的,无论程序再安全,也无非是破解难度的问题。

apk的混淆加固,相关密钥的安全存储,以及接口的加密,都是我们加深App安全的操作,也是进一步加深黑产用户的破解难度,对于数据的流失,防黑产,一般都是和接口挂钩,大部分也都是服务端需要考虑的,毕竟交互的最终结果都是传到服务端,无非前端做一些配合服务端的事情。

那么除了以上的相关处理,前端是否还有其他的简单逻辑,告知服务端,当前用户是否是真实用户呢?当然是可以的,说好了,只能是简单,纯粹的简单,不参杂一丁点的复杂思想。实现思路,其实就是针对项目中的用户最常用行为轨迹,进行埋点统计,如果触发了这个行为轨迹,就告知服务端,这是一个真实用户;这种方式只能简单的进行统计,主观意识上认为它是真实用户,并不能做到百分百,但也能起到一定的作用,比如可以定位那些暴力的刷接口行为,通过这种方式,我们就可以避免这种行为。

一个项目中的功能有很多,比如电商中的购物,及时通讯中的聊天等等,针对不同的App,肯定有用户最常用的功能,这就是大概率的用户习惯,针对这些用户习惯,我们可以设计相对应的路径,也就是用户,通过哪些事件后,进入到了最后的功能,比如购物,用户触发了商品列表,点击了商品后进入到商品详情,然后点击购买,最后发起了支付,这就是一个路径,我们可以称为是一个事件链。

事件的统计方式:

一个事件链,从开始到结束,可能有很多事件,但每一个事件链是唯一的,如下图的事件链ABC,记录好定义的事件链,就可以针对当前事件链,进行逐个事件统计,如下图中的123,到end结束,end为当前事件链结束的标识,得到结束的标识后,就得到了一个用户的执行流程,就可以上报到服务端。

举例(登录操作),定义事件链为login:

打开应用-->点击我的-->立即加入-->输入手机号-->输入验证码-->点击登录-->登录成功

以上是登录从开始到结束的整个事件链流程,针对每一个事件进行存储,除最后一个事件是end标识,前边的都为存储类型,当执行到end类型后就可以上报此事件链。

事件链的上传结果,包含用户的id,各个事件的触发标识。

具体实现:

基本的逻辑就是如上,代码也不复杂,总共可以分为三个方面,第一个是事件的统计,其实和埋点的思路一致,第二个是,针对事件链或者事件的存储,第三个就是事件的上传。

class BlackProductionUtils {private val mPreferences = "gwmBlack"private val mSpEvent = "spEvent"private var mSp: SharedPreferences? = nullprivate var mOnce: Boolean = false//全局单次上传,所有事件链只上报一次companion object {@JvmStaticprivate var instance: BlackProductionUtils? = nullget() {if (field == null) {field = BlackProductionUtils()}return field}@JvmStaticfun get(): BlackProductionUtils {return instance!!}}/*** AUTHOR:AbnerMing* INTRODUCE:once:是否一个事件链只执行一次*/fun init(context: Context, once: Boolean = false) {mOnce = oncemSp = context.getSharedPreferences(mPreferences, 0)}/*** AUTHOR:AbnerMing* INTRODUCE:添加事件,key为事件链标识,position为事件索引,* start是事件开始,end是结束事件的标识*/fun addEvent(key: String, position: Int,start: Boolean = false,end: Boolean = false) {try {//首先判断是否单次上报,如果是,取出标识,存在就中断执行if (mOnce && getString(mSpEvent).contains(key)) {return}if (start) {//进行清空事件,从新开始put(key, "")}//首先获取var eventData = getString(key)if (!TextUtils.isEmpty(eventData)) {//证明存在数据eventData += containsPosition(eventData, position)} else {//证明不存在eventData = position.toString()}if (end) {//结束,进行上报此事件uploadEvent(key, eventData)} else {//无结束put(key, eventData)}} catch (e: Exception) {e.printStackTrace()}}/*** AUTHOR:AbnerMing* INTRODUCE:是否包含*/private fun containsPosition(eventData: String, position: Int): String {val p = position.toString()return if (!eventData.contains(p)) {p} else {""}}/*** AUTHOR:AbnerMing* INTRODUCE:上报事件,key:事件链标识,eventData:一个事件链的所有事件*/private fun uploadEvent(key: String, eventData: String) {val spEvent = getString(mSpEvent)if (mOnce) {if (!spEvent.contains(key)) {addSpKey(key)//单次进行上传reportEvent(key, eventData)}} else {//每次进行上传reportEvent(key, eventData)}}/*** AUTHOR:AbnerMing* INTRODUCE:走接口,统一上报*/private fun reportEvent(key: String, eventData: String) {}/*** AUTHOR:AbnerMing* INTRODUCE:保存事件链Key*/private fun addSpKey(key: String) {//记录每一个事件链标识var spKey = getString(mSpEvent)spKey += keyput(mSpEvent, spKey)}private fun put(key: String, value: String) {try {mSp!!.edit().putString(key, value).commit()} catch (e: Exception) {e.printStackTrace()}}private fun getString(key: String, defaultVal: String = ""): String {var mValue = ""mSp?.let {mValue = it.getString(key, defaultVal)!!}return mValue}/*** AUTHOR:AbnerMing* INTRODUCE:清除所有的事件*/fun clearEvent() {mSp?.let {it.edit().clear().commit()}}
}

调用

1、初始化

默认每次事件链执行完都上传

BlackProductionUtils.get().init(this)

一个事件链只上传一次

BlackProductionUtils.get().init(this,true)

2、添加事件

默认false,不清除原有事件,true为每次事件开始时,都会重新记录事件,具体情况,比如当前事件链有10个事件,用户触发了前5个,后面不走了,隔了一段时间又从事件1开始了,之前存储的事件,清除还是保存,就是这个意思。

事件开始

BlackProductionUtils.get().addEvent("main", 0, true)

正常的事件存储,实际会有多个

BlackProductionUtils.get().addEvent("main", 1)

事件结束

BlackProductionUtils.get().addEvent("main", 3, end = true)

告知服务端调用reportEvent方法即可。

相关的逻辑就是如上代码,可以根据自己项目的存储方式,或者其他逻辑进行更改。大家可以简单的认为就是埋点,然后进行上报服务端,服务端会根据每个用户上报的事件链,来进行统计分析。

防黑产,以上的方式,开头已经陈述,并不能做到百分百,通过多个事件链,但也能够有效的过滤一些非真实用户,当然了,具体情况具体分析,你说它有意义,它就存在意义,若没意义,其实也没任何意义。

Android端如何简单的防黑产相关推荐

  1. pinyin4j 使用 -android端的简单实践

    pinyin4j 使用 -android端的简单实践 pinyin4j的主页:http://pinyin4j.sourceforge.net/ pinyin4j是一个支持将中文转换到拼音的Java开源 ...

  2. 社交类App如何防黑产垃圾用户?

    社交网络业务安全存在的问题 近日,国家网信办会同有关部门,针对网络音频乱象启动专项整治行动.首批对市面上26款app分别采取了约谈.下架.关停服务等处罚.前不久探探App就是因出现违规内容(涉黄)被下 ...

  3. 数美科技 | “双十一”全网狂欢,防“黑产”刻不容缓

    距2009年淘宝首创"双十一"至今,已过去了十余年,这场一年一度的购物狂欢,给了全国"剁手党"多年来始终无法抗拒的理由--"价格史低"!优惠 ...

  4. android 自定义分辨率,Moonlight Android端自定义分辨率,解决黑边问题

    更新:使用原版moonlight修改特殊分辨率需要root权限,没有root权限可尝试此版本的moonlight选择当前设备分辨率. 再次更新:moonlight 9.8版本以上已经支持设置为当前设备 ...

  5. 腾讯游戏安全年度报告出炉:外挂样本持续增长,隐晦作弊现象丛生、游戏黑产资产惊人

    2019年国内游戏领域趋势变化明显,行业重归"产品为王"的时代.移动互联网的发展.版号政策松绑.下沉市场蕴藏巨大商机.5G和云游戏成为游戏领域的X因素,网络游戏行业正在新战场上&q ...

  6. 独家食用指南系列|Android端SQLCipher的攻与防新编

    大家好,今天给大家的是本周技术拆解官的第二篇文章,主题依然是沿用上一篇文章的主题–Android端SQLite的"食用指南",上篇文章我们讲到了基本的SQLite的定义.使用方法以 ...

  7. 积目在网络诈骗类黑产对抗的防控与思考

    导读:本文主要介绍积目风控负责人徐铭老师,在对抗黑灰产中的一些心得.实践经验,希望通过分享,能给大家带来一些新的思路和方法.本文将首先介绍关于积目app和主要风险点.其次是遇到的一些共性问题及总体对抗 ...

  8. android实现mysql数据库存储_一个简单的Android端对象代理数据库系统的实现(二、执行+存储)...

    这是我之前在武汉大学彭智勇老师那边做过的一个对象代理数据库系统.文中给出了一整个系统的几乎所有代码,经测试可正常运行.文章比较长,超出了知乎的最长文章范围,因此分为两篇文章.这是第二篇. 执行 执行部 ...

  9. 怼黑产、防泄漏、反诈骗 阿里安全工程师的双11“大招”

    2017天猫双11又一次创造了商业奇迹,高达1682亿的交易额,交易峰值为32.5万笔/秒,支付峰值为25.6万笔/秒.这一组数据已经足够惊人,但更令人称奇的是,双11当天用户获得了"如丝般 ...

最新文章

  1. 从头开始 Struts 2 入门
  2. python的中文含义-python关键字以及含义,用法
  3. 【读书笔记】iOS-属性
  4. 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)
  5. CentOS升级gcc到4.8.2以支持C++11标准的方法
  6. boost::log::sources::severity_channel_logger_mt用法的测试程序
  7. 弹窗要打开或保存来自_如何让 PopClip 支持印象笔记客户端:保存到印象笔记amp;高亮文字...
  8. Python 基础知识学习笔记——NumPy
  9. 和信虚拟终端的全面部署-虚拟终端网络工程实施
  10. 2009年度工作安排计划
  11. 图纸管理软件_企业图纸文档的安全管理与使用,是否遇到这些图纸管理问题?...
  12. ABBYY FineReader添加盖章戳记
  13. mysql front 垃圾_MySQL_Front 的缺点
  14. VSCODE mac版下载慢解决办法
  15. java gzip rest_使用restclient或postman发送gzip数据
  16. 11. 深度学习实践:实践方法论
  17. 第三方支付接口申请流程
  18. 点球大战中的概率问题
  19. 电子签名、私钥、公钥
  20. 多变量微分方程组带事件控制的ODE45函数写法

热门文章

  1. 如何获取自己的公网地址
  2. AR、VR、MR 别傻傻分不清了
  3. 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
  4. java LocalDateTime 加时间,计算两个时间的差
  5. vue中svg转png下载
  6. (转)Linux——pv、vg和lv的概念
  7. c# 实现语音播报功能 转发
  8. arcengine双击属性表内的一行,定位到该要素,并添加到选择集
  9. 使用浏览器访问服务器shell(ssh方式)
  10. TXLINE 这个软件 计算 微带线的宽度