【注册/登录安全分析报告:孔夫子旧书网】

前言

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

  1. 暴力破解密码,造成用户信息泄露
  2. 短信盗刷的安全问题,影响业务及导致用户投诉
  3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞
    在这里插入图片描述
    所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析

一、 孔夫子旧书网 PC 注册入口

简介:孔网创建于2002年,是大型的二手旧货、古旧图书和商品交易平台,是传统文化行业结合互联网而搭建的C2C平台,是有传统文化价值的旧货市场。网站主要板块是书店区和拍卖区。网站秉承“网罗天下图书,传承中华文明”的理念,致力于发掘、抢救、保护和传播中国传统文化资源。

在这里插入图片描述

在这里插入图片描述

二丶 安全分析:

采用传统的图形验证码方式,具体为6个数字及英文,ocr 识别率在 95% 以上。

测试方法:
采用模拟器+OCR识别

1. 模拟器交互

private static String INDEX_URL = "https://login.kongfz.com/register/index.html";@Overridepublic RetEntity send(WebDriver driver, String areaCode, String phone) {RetEntity retEntity = new RetEntity();try {driver.get(INDEX_URL);// 1 输入手机号WebElement phoneElemet = ChromeDriverManager.waitElement(driver, By.id("phone"), 1);phoneElemet.sendKeys(phone);// 2 获取图形验证码WebElement sendElement = driver.findElement(By.xpath("//a[contains(text(),'获取验证码')]"));sendElement.click();Thread.sleep(1 * 1000);WebElement imgElement = ChromeDriverManager.waitElement(driver, By.xpath("//li[@class='verityBox']/div/span/img[contains(@src,'/Pc/ajax/showSimpleCaptcha')]"), 20);sendElement = (imgElement == null) ? ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'获取验证码')]"), 10) : null;if (sendElement != null) {sendElement.click();Thread.sleep(1500);WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后可重发')]"), 10);String gtInfo = (gtElement != null) ? gtElement.getText() : null;if (gtInfo != null && gtInfo.contains("秒后可重发")) {retEntity.setMsg("[无感验证通过]->" + gtInfo);retEntity.setRet(0);return retEntity;}}if (imgElement == null) {return null;}System.currentTimeMillis();imgElement.click();Thread.sleep(1000);String imgCode = null, picUrl;byte[] imgByte = null;for (int i = 0; i < 3; i++) {System.currentTimeMillis();picUrl = imgElement.getAttribute("src");imgByte = (picUrl != null) ? GetImage.callJsByUrl(driver, picUrl) : null;imgCode = ddddOcr.getImgCode(imgByte);if (imgCode != null && imgCode.length() >= 6) {ddddOcr.saveFile("KongFz/", imgCode, imgByte);break;} else if (imgCode != null && imgCode.contains("=")) {System.out.println("算术运算");return null;}imgElement.click();Thread.sleep(1 * 1000);}if (imgCode == null || imgCode.length() < 1) {return null;}// 3 输入识别出来的图形验证码WebElement codeInputElement = driver.findElement(By.id("verity"));codeInputElement.sendKeys(imgCode);Thread.sleep(1 * 1000);sendElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'获取验证码')]"), 10);if (sendElement != null) {sendElement.click();Thread.sleep(2 * 1000);}WebElement gtElement = ChromeDriverManager.waitElement(driver, By.xpath("//a[contains(text(),'秒后可重发')]"), 10);if (gtElement == null) {WebElement errElement = ChromeDriverManager.waitElement(driver, By.xpath("//span[@class='red' and contains(text(),'短信发送太快')]"), 10);String errInfo = (errElement != null) ? errElement.getText() : null;if (errInfo != null) {retEntity.setMsg("[imgCode:" + imgCode + "]->" + errInfo);String lateTime = DigitFormat.getDigit(errInfo);System.out.println(errInfo + "->sleep " + lateTime);Thread.sleep(Integer.parseInt(lateTime) * 1000);return retEntity;}}String gtInfo = (gtElement != null) ? gtElement.getText() : null;retEntity.setMsg("[imgCode:" + imgCode + "]->" + gtInfo);if (gtInfo != null && gtInfo.contains("秒后可重发")) {retEntity.setRet(0);}return retEntity;} catch (Exception e) {System.out.println("phone=" + phone + ",e=" + e.toString());for (StackTraceElement ele : e.getStackTrace()) {System.out.println(ele.toString());}return null;} finally {if (driver != null)driver.manage().deleteAllCookies();}}

2. 获取图形验证码


public static byte[] callJsById(WebDriver driver, String id) {return callJsById(driver, id, null);}public static byte[] callJsById(WebDriver driver, String id, StringBuffer base64) {String js = "let c = document.createElement('canvas');let ctx = c.getContext('2d');";js += "let img = document.getElementById('" + id + "'); /*找到图片*/ ";js += "c.height=img.naturalHeight;c.width=img.naturalWidth;";js += "ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);";js += "let base64String = c.toDataURL();return base64String;";String src = ((JavascriptExecutor) driver).executeScript(js).toString();String base64Str = src.substring(src.indexOf(",") + 1);if (base64 != null) {base64.append(base64Str);}byte[] vBytes = (base64Str != null) ? imgStrToByte(base64Str) : null;return vBytes;}

3.图形验证码识别(Ddddocr)


public String getImgCode(byte[] bigImage) {try {if (ddddUrl == null) {System.out.println("ddddUrl=" + ddddUrl);return null;}long time = (new Date()).getTime();HttpURLConnection con = null;String boundary = "----------" + String.valueOf(time);String boundarybytesString = "\r\n--" + boundary + "\r\n";OutputStream out = null;URL u = new URL(ddddUrl);con = (HttpURLConnection) u.openConnection();con.setRequestMethod("POST");con.setConnectTimeout(10000);con.setReadTimeout(10000);con.setDoOutput(true);con.setDoInput(true);con.setUseCaches(true);con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);out = con.getOutputStream();if (bigImage != null && bigImage.length > 0) {out.write(boundarybytesString.getBytes("UTF-8"));String paramString = "Content-Disposition: form-data; name=\"image\"; filename=\"" + "bigNxt.gif" + "\"\r\n";paramString += "Content-Type: application/octet-stream\r\n\r\n";out.write(paramString.getBytes("UTF-8"));out.write(bigImage);}String tailer = "\r\n--" + boundary + "--\r\n";out.write(tailer.getBytes("UTF-8"));out.flush();out.close();StringBuffer buffer = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));String temp;while ((temp = br.readLine()) != null) {buffer.append(temp);}String ret = buffer.toString();if (ret.length() < 1) {System.out.println("ddddUrl=" + ddddUrl + " ret=" + buffer.toString());}return buffer.toString();} catch (Throwable e) {logger.error("ddddUrl=" + ddddUrl + ",e=" + e.toString());return null;}}public void saveFile(String factory, String imgCode, byte[] imgByte) {try {String basePath = ConstTable.codePath + factory + "/";File ocrFile = new File(basePath + imgCode + ".png");FileUtils.writeByteArrayToFile(ocrFile, imgByte);} catch (Exception e) {logger.error("saveFile() " + e.toString());}}

4. 图形OCR识别结果:

在这里插入图片描述

5. 测试返回结果:

在这里插入图片描述

三 丶测试报告 :

在这里插入图片描述

四丶结语

孔夫子网简称孔网,创建于2002年,是大型的二手旧货、古旧图书和商品交易平台,是传统文化行业结合互联网而搭建的C2C平台,是有传统文化价值的旧货市场。网站主要板块是书店区和拍卖区。网站秉承“网罗天下图书,传承中华文明”的理念,致力于发掘、抢救、保护和传播中国传统文化资源。作为旧古书二手市场平台的“独角兽”企业, 技术实力也应该不错,但采用的还是老一代的图形验证码已经落伍了, 用户体验一般,容易被破解, 一旦被国际黑客发起攻击,将会对老百姓形成骚扰,影响声誉。

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

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

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

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

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

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

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

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

相关文章

Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!

Windows环境Apache httpd 2.4 web服务器加载PHP8&#xff1a;Hello&#xff0c;world&#xff01; &#xff08;1&#xff09;首先需要安装apache httpd 2.4 web服务器&#xff1a; Windows安装启动apache httpd 2.4 web服务器-CSDN博客文章浏览阅读222次&#xff0c;点赞5次&…

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标&#xff0c;能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱&#xff0c;无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成&#xff08;RAG&#xff09;聊天…

python14_运算符复合赋值

复合赋值缩写 A 7 B 3 C "hello" D "world" E True F False# 加法赋值运算符,7 3 10 def add1(a, b):a b # 等同于a a breturn a# 字符串加法赋值运算符,hello world helloworld def add2(c, d):c d # 等同于字符串拼接,c c dreturn c# …

个人网站介绍和部署(开源)

前言&#xff1a; 大家好&#xff0c;我是神的孩子都在歌唱&#xff0c;这是我csdn的博客 , 这是我做的一个神唱网站项目&#xff0c;专门是为了满足自己的需求写的&#xff0c;需要什么就做什么&#xff0c;代码完全开源github&#xff0c;含有安装部署教程&#xff0c;此项目…

探索私有化聊天软件:即时通讯与音视频技术的结合

在数字化转型的浪潮中&#xff0c;企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信&#xff0c;作为音视频通信技术的佼佼者&#xff0c;凭借其强大的即时通讯与音视频SDK&#xff08;软件开发工具包&#xff09;结合能力&#xff0c;为企业量身打造了私有化聊天…

Java数组使用练习(完)

目录 1.数组的使用 1.1数组拷贝native 1.2二分查找 1.3数组元素的平均值 1.4数组元素的排序 1.5其他的常用的方法 1.6冒泡排序实现 1.7数组元素的逆置实现 1.8二维数组 2.关于数组的课后练习 2.1改变数组原有的元素的值 2.2奇数在前&#xff0c;偶数在后 2.3判断目…

深入理解人工智能:从机器学习到深度学习

深入理解人工智能&#xff1a;从机器学习到深度学习 前言人工智能&#xff08;AI&#xff09;实际应用示例代码 机器学习&#xff08;ML&#xff09;分类常见算法示例代码 深度学习&#xff08;DL&#xff09;应用示例代码 神经网络&#xff08;NN&#xff09;研究方向示例代码…

Midjourney中文版:解锁AI艺术创作的无限潜能

在数字化时代&#xff0c;艺术创作与科技的融合正以前所未有的速度推进&#xff0c;而Midjourney中文版正是这一趋势下的璀璨明星。作为一款专为中文用户设计的AI绘图工具&#xff0c;它不仅集成了最先进的深度学习技术&#xff0c;还通过本地化优化&#xff0c;为国内设计师和…

element 输入框文字+对应签进行长度 和 的判断

输入文字长度 指定标签的长度 &#xff08;判断长度并提示&#xff09; <div style"position: relative;" classchangyongyu><el-input type"textarea" :autosize"{ minRows: 8, maxRows: 8 }" style"margin-bottom:10px;"…

Lombok同时使⽤@Data和@Builder遇到的坑

Lombok同时使⽤Data和Builder遇到的坑 Lombok是什么有什么问题不使用任何注解只使用Data注解只使用Builder注解同时使用Data和Builder注解 如何解决Builder和NoArgsConstructor冲突使用AllArgsConstructor Lombok是什么 Lombok 是一个 Java 库&#xff0c;它通过注解的方式帮助…

【Linux】进程替换

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 进程程序替换 代码和现象 替换函数 替换原理 函数解释 命名理解 简易s…

视频美颜SDK与直播美颜工具API是什么?计算机视觉技术详解

今天&#xff0c;小编将深入探讨视频美颜SDK与直播美颜工具API的概念及其背后的计算机视觉技术。 一、视频美颜SDK的概念 视频美颜SDK是一套用于开发实时美颜效果的工具集&#xff0c;开发者可以利用它在视频流中实现面部特征的优化。这些SDK通常提供了一系列功能&#xff0c…

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

SpringBoot3脚手架

MySpringBootAPI SpringBoot3脚手架&#xff0c;基于SpringBoot3DruidPgSQLMyBatisPlus13FastJSON2Lombok&#xff0c;启动web容器为Undertow(非默认tomcat)&#xff0c;其他的请自行添加和配置。 <java.version>17</java.version> <springboot.version>3.3…

fastAPI教程:jinja2模板

FastAPI 五、jinja2模板 jinja是python知名web框架Flask的作者开发的⼀个开源的模板系统&#xff0c;起初是仿django模板的⼀个模板引擎DjangoTPL&#xff0c;为Flask提供模板支持&#xff0c;由于其灵活&#xff0c;快速和安全等优点被⼴泛使用。 jinja2是jinja2这个模块的…

erlang学习:Linux命令学习8

shell脚本案例学习 循环求 1-100 的每一步和 —案例 j0 i1 while((i<100)) do j$((ji)) echo $j ((i)) done每 30 s循环判断一次 user 用户是否登录系统 —案例 设置了一个次数&#xff0c;如果循环了五次在user文件中添加user用户&#xff0c;表示用户登录 USERS"u…

nodejs安装及环境配置

一、下载 进入官网https://nodejs.org/en/download/prebuilt-installer下载node.js安装包&#xff0c;选择对应版本的node&#xff0c;这里我选择的是14.21.3版本 二、安装 1、下载完成后&#xff0c;双击“node-v14.21.3-x64.msi”&#xff0c;开始安装Node.js 2、勾选复…

【电机-概述及分类】

文章目录 第1章1-1 电机的定义1-2 电机的构成要素1-3 电机的分类1-3-1 直流电机1-3-1-1 永磁励磁型直流电机1-3-1-2 电磁铁励磁型直流电机 第1章 重新认识电机的体系 电机包括许多种类。换个角度来看&#xff0c;并没有完美的电机&#xff0c;某种电机具有所谓A的优点&#xf…

STM32F1+HAL库+FreeTOTS学习14——数值信号量

STM32F1HAL库FreeTOTS学习13——数值信号量 1. 数值信号量2. 相关API函数2.1 创建计数信号量2.2 获取信号量2.3 释放信号量2.4 删除信号量2.5 获取信号量的计数值 3. 操作实验1. 实验内容2. 代码实现&#xff1a;运行结果 上一期我们学习了二值信号量 &#xff0c;这一期学习计…

在线相亲系统:新时代的婚恋观与传统习俗的碰撞

随着互联网技术的发展&#xff0c;相亲交友平台已成为年轻人寻找伴侣的新方式。这些平台不仅改变了人们的社交习惯&#xff0c;也反映了当代婚恋观与传统习俗之间的碰撞与融合。开发h17711347205本文将探讨在线相亲系统是如何在尊重传统的基础上&#xff0c;为现代年轻人提供更…