当前位置: 首页 > news >正文

防sql注入的网站登录系统设计与实现

课程名称

网络安全

大作业名称

防sql注入的网站登录系统设计与实现

姓名

学号

班级

  1. 结合mysql数据库设计一个web登录页面
  2. 密码需密文存放(可以采用hash方式,建议用sha1或md5加盐)
  3. 采用服务器端的验证码(防止bp爆破)或token方式
  4. 对同一ip地址登录错误超过3次,暂停5分钟(防止bp爆破,sqlmap爆破)
  5. 能够防住简单注入和宽字节注入(需有测试的案例)
  6. 能够基本防住手动注入和sqlmap攻击(需有测试的案例)
  7. 能够防止sql注入原因分析
  8. 课程心得体会、建议。  

SQL注入详解(全网最全,万字长文)-CSDN博客

  1. 结合mysql数据库设计一个web登录页面
  1. 密码需密文存放(可以采用hash方式,建议用sha1或md5加盐)

String newPwdMD5 = DigestUtils.md5DigestAsHex(newPwd.getBytes(StandardCharsets.UTF_8));

  1. 采用服务器端的验证码(防止bp爆破)或token方式

public class GenerateCaptchaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, IOException {
       int width = 150;
       int height = 50;
       BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
       Graphics2D g2d = image.createGraphics();
       g2d.setColor(Color.WHITE);
       g2d.fillRect(0, 0, width, height);
       g2d.setFont(new Font("Arial", Font.BOLD, 30));
       Random random = new Random();
       int captchaValue = random.nextInt(9000) + 1000;
       String captcha = String.valueOf(captchaValue);
       g2d.setColor(Color.BLACK);
       g2d.drawString(captcha, 20, 35);
       request.getSession().setAttribute("captcha", captcha);
       response.setContentType("image/png");
       ImageIO.write(image, "png", response.getOutputStream());
    }
}

if (!enteredCaptcha.equals(storedCaptcha)) {
    session.setAttribute("msg", "验证码错误");
    incrementErrorCount(ipAddress, request, response);
    return;
}

  1. 对同一ip地址登录错误超过3次,暂停5分钟(防止bp爆破,sqlmap爆破)

在登录的时候先检查IP有没有被停用,然后接着就是检测验证码,账户,密码,只要错误就调用incrementErrorCount。

IpErrorCounts是一个HashMap用于记录相应ip的错误次数。

pausedIps用于记录停用时间

private void incrementErrorCount(String ipAddress, HttpServletRequest request, HttpServletResponse response) throws IOException {
    Integer errorCount = ipErrorCounts.getOrDefault(ipAddress, 0);
    errorCount++;
    ipErrorCounts.put(ipAddress, errorCount);
    // 如果错误次数超过 3 次,暂停 IP
    if (errorCount > 3) {
       pausedIps.put(ipAddress, new Date());
    }
    response.sendRedirect(request.getContextPath() + "/goat.jsp");
}

// 获取 IP 地址
String ipAddress = request.getRemoteAddr();

// 检查 IP 是否被暂停(这里的pausedlps是一个HashMap)
if (pausedIps.containsKey(ipAddress)) {
    Date pauseStartTime = pausedIps.get(ipAddress);
    Date currentTime = new Date();
    long timeDiff = currentTime.getTime() - pauseStartTime.getTime();
    long fiveMinutesInMillis = 5 * 60 * 1000;
    if (timeDiff < fiveMinutesInMillis) {
       HttpSession session = request.getSession();
       session.setAttribute("msg", "你的 IP 因多次登录失败被暂停,请 5 分钟后再试。");
       response.sendRedirect(request.getContextPath() + "/goat.jsp");
       return;
    } else {
       pausedIps.remove(ipAddress);
    }
}

  1. 能够防住简单注入和宽字节注入(需有测试的案例)

其实sql注入说白了,就是需要到达数据库那个层面才能发挥作用,我直接正则限制输入再加上输入不符合就直接阻止事件的发生,干掉。

const emailRegex = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
const numberRegex = /^\d+$/;

loginBtn.click(function (event) {
    let username = userName.val();
    let pwd = passWord.val();
    let captcha = captchaInput.val();
    if (username === "" || pwd === "" || captcha === "") {
        error.text("存在未填写的信息,请输入");
        event.preventDefault();
        return false;
    }
    else if(!emailRegex.test(username)){
        error.text("邮箱格式错误");
        event.preventDefault();
    }
    else if(!numberRegex.test(pwd)){
        error.text("密码格式错误");
        event.preventDefault();
    }
});

宽字节注入:

攻击者输入用户名 admin%df' or 1=1-- 和任意密码,当应用程序将这个用户名拼接到 SQL 查询中时,由于数据库连接使用了宽字节字符编码(如 GBK),%df'会被解释为一个汉字,从而绕过了单引号的过滤。

  1. 能够基本防住手动注入和sqlmap攻击(需有测试的案例)

手工注入:

在知道邮箱(账户)的情况下可以使用

第一张图片解析(个人理解):

我这里先假设我前端没有用正则会是什么情况

点击登录后的数据库语句

select * from reader where email = ‘taotao@qq.com’#’

select * from reader where email = ‘taotao@qq.com’#’ and pwd=’...’

第一张图片:

在数据库中#代表的是注释,#后面的就不用管了

这里可以讨论一下以上两种登录方式:

第一种是先根据用户名来找到一个对象,然后在判断密码是否正确的,这种就能防止现在这种情况的注入。

但是第二种是直接查,这种密码是多少都可以,只要邮箱正确就行,明显防止不了。当然如果在后面又加了判断密码也可以防止,但是这样的话,相较于第一种代码量增加,还浪费了资源(查了两个字段,为了防止注入,还要复制第一种写法后面的代码,多了判断)

第二种图片:

有同学自己可能写了一下,感觉不行,觉得密码不对过不了,觉得是从左到右先or然后在and,那就错了

select * from reader where email = ‘taotao@qq.com’or’1’=’1’ and pwd=’...’

在数据库中,and的优先级比or高,所以语句可以这样表示:

select * from reader where (email = ‘taotao@qq.com’)or(’1’=’1’ and pwd=’...’)

是先and然后在or,一目了然

当然如果直接正则限制输入,那这种注入都到不了数据库那一层面,直接限制到了前端,请求都发不过去。

Sqlmap攻击:

sqlmap基础知识_sqlmap简介-CSDN博客

最直接的方法直接不使用关系型数据库,用Nosql。(开玩笑)

在查询了相关资料后,了解到这种注入方式居然可以直接绕过前端的检测,牛的,那这直接打破我的认知,又要思考了。。。。。那就加后端检测吧。查资料(应该在后端服务器端进行严格的输入验证和 SQL 注入防范措施,如使用参数化查询、输入过滤和转义等技术,以确保数据库的安全。)。

那就直接在后端也搞正则检测。

这个没有进行实操过,当然也不太清楚怎么去实操,没了解过。

  1. 能够防止sql注入原因分析

Sql注入无非就是写一段sql代码来插入到一些sql语句当中,利用#、’等符号来实现一些不可思议的作用,所以对于输入的检测、过滤是必要的。

前端我是用的正则表达式来判断输入的东西,并且不符合就阻止事件的发生(请求),而且我后端是先根据输入的东西找到一个对象,再去判断其他的。当然post请求也发挥着作用,毕竟如果是get请求url就直接显示相关信息了。

相关文章:

防sql注入的网站登录系统设计与实现

课程名称 网络安全 大作业名称 防sql注入的网站登录系统设计与实现 姓名 学号 班级 大 作 业 要 求 结合mysql数据库设计一个web登录页面密码需密文存放&#xff08;可以采用hash方式&#xff0c;建议用sha1或md5加盐&#xff09;采用服务器端的验证码&#…...

如何快速切换电脑的ip地址

在当今的数字化时代&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其重要性日益凸显。无论是出于保护个人隐私的需要&#xff0c;还是为了访问特定的网络服务等&#xff0c;快速切换电脑的IP地址已成为许多用户的迫切需求。本文将为你介绍几种实用的方法&#xff0c;帮…...

鸿蒙HarmonyOS之选择相册文件(照片/视频)方法

一、新建文件工具类FileUtil.ets 包含&#xff1a;选择照片方法、获取文件类型方法、去除后缀、获取后缀方法 import { BusinessError, request } from kit.BasicServicesKit; import photoAccessHelper from ohos.file.photoAccessHelper; import bundleManager from ohos.b…...

【QT Qucik】C++交互:接收QML信号

在本节课中&#xff0c;我们将深入探讨如何在C中接收QML发出的信号。我们将分为几个部分&#xff0c;详细说明信号的定义、发送及其在C中的接收。 理解信号和槽机制 Qt的信号与槽机制是一种用于对象之间通信的强大工具。信号是对象在特定事件发生时发送的通知&#xff0c;而槽…...

【C++】关键字+命名空间

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的命名空间&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 关键字二. 命名空间2.1 命名空间的定义2.2 命名空间的使用a. 命名空间名称作用域限定…...

网络层——IP

IP地址 结构&#xff1a; 由32位二进制数组成&#xff0c;通常用点分的形式被分为四个部分&#xff0c;每个部分1byte&#xff0c;最大值为255。 从功能的角度看&#xff0c;ip地址由两部分组成&#xff0c;网络号和主机号。网络号标识了ip所在的网段&#xff0c;主机号标识了…...

随笔 漫游互联网

网络编程基础&#xff1a;漫游互联网 温故而知新&#xff0c;可以为师矣。互联网我们可以想象成一个立体的网状结构&#xff0c;由一个一个的小网络组成的网状结构&#xff0c;在一个一个小网络中通过一台一台机器组成&#xff0c;经过几十年的发展终于有了今天这个样子。谈论…...

8.9K Star,开源自托管离线翻译引擎

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在全球化的今天&#xff0c;跨语言交流已成为日常需求&#xff0c;然…...

MySQL基础之DML

MySQL基础之DML 语法不区分大小写 分类 DD(definition)L 定义DM(manipulation)L 操作DQ(query)L 查询DC(control)L 控制 添加数据 # 指定字段添加数据(一条)insert into 表名(字段1,字段2,...) values(值1,值2,...);# 全部字段添加数据(一条)insert into 表名 values(值1,值…...

男单新老对决:林诗栋VS马龙,巅峰之战

听闻了那场激动人心的新老对决&#xff0c;不禁让人热血沸腾。在这场乒乓球的巅峰之战中&#xff0c;林诗栋与马龙的对决无疑是一场视觉与技术的盛宴。 3:3的决胜局&#xff0c;两位选手的每一次挥拍都充满了策略与智慧&#xff0c;他们的每一次得分都让人心跳加速。 林诗栋&am…...

Java如何判断堆区中的对象可以被回收了?

如何判断堆区中的对象可以被回收了 在Java中&#xff0c;垃圾回收机制会帮助我们自动回收不再被使用的对象&#xff0c;已到达即使释放内存的效果&#xff0c;但是Java又是怎么知道哪些对象不会再被我们继续使用了呢&#xff0c;希望你通过本篇文章&#xff0c;理解引用计数法与…...

.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态&#xff0c;判断是否可以访问互联网。传送门&#xff1a;获取本机网络状态 这次我们监听网络状态切换&#xff0c;具体代码如下&#xff1a; public class WindowsNetworkHelper {private static Action<bool>? _NetworkStatusCh…...

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…...

算法 | 位运算(哈希思想)

位运算 &与两个位都为1时&#xff0c;结果才为1&#xff08;有0为0&#xff09;|或两个位都为0时&#xff0c;结果才为0&#xff08;有1为1&#xff09;^异或两个位相同为0&#xff0c;相异为1~取反0变1&#xff0c;1变0<<左移各二进位全部左移若干位&#xff0c;高…...

前端提升方向

1、脚手架配置&#xff1a;首先你会发现&#xff0c;一旦团队项目里多个项目之间的配置或者规范不同步&#xff0c;那么每个项目的配置都需要手动修改&#xff0c;而这很浪费时间。所以&#xff0c;你可以发起了一个团队的脚手架项目&#xff0c;把项目中的代码规范、Vite 配置…...

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候&#xff0c;效果是否会很好&#xff1f;在这篇论文中&#xff0c;作者给出了答案&#xff1a;Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…...

鸿蒙ArkUI实战开发-主打自研语言及框架

ArkUI 是 HarmonyOS 的声明式 UI 开发框架&#xff0c;而 ArkUI-X 是基于 ArkUI 框架扩展而来的跨平台开发框架。ArkUI-X 支持 HarmonyOS、OpenHarmony、Android 和 iOS 平台&#xff0c;允许开发者使用一套代码构建支持多平台的应用程序。 一、ArkUI-X 的实战开发步骤 在实战开…...

HDU Sit sit sit (区间DP+组合数)

题目大意&#xff1a;有 n 张椅子&#xff0c;n 个人&#xff0c;所有人都可以按照任意顺序坐在任意一张椅子上&#xff0c;但是同时满足这三种情况的椅子不能坐&#xff1a; 1.椅子上有左右两张相邻的椅子。 2.左右相邻的椅子不是空的。 3.左右相邻的椅子颜色不同。 如果当前学…...

Qt开发技巧(十四)文字的分散对齐,设置动态库路径,进度条控件的文本,文件对话框的卡顿,滑块控件的进度颜色,停靠窗体的排列,拖拽事件的坑

继续讲一些Qt开发中的技巧操作&#xff1a; 1.文字的分散对齐 有时候需要对文本进行分散对齐显示&#xff0c;相当于无论文字多少&#xff0c;尽可能占满整个空间平摊占位宽度&#xff0c;但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Qt::Align…...

VirtulBOX Ubuntu22安装dpdk23.11

目录 依赖包安装 Python安装 numa安装 ​编辑Python pip3安装 ​编辑pyelftools安装 meson和ninja安装 ​编辑构建与编译 Meson构建DPDK ​编辑Ninja安装DPDK ​编辑VFIO-PCI驱动安装 大页内存和IOMMU配置 ​编辑VFIO-PCI加载 ​编辑VFIO-PCI驱动绑定 ​编辑dpdk…...

线性代数书中求解齐次线性方程组、非齐次线性方程组方法的特点和缺陷(附实例讲解)

目录 一、克拉默法则 1. 方法概述 2. 例16(1) P45 3. 特点 (1) 只适用于系数矩阵是方阵 (2) 只适用于行列式非零 (3) 只适用于唯一解的情况 (4) 只适用于非齐次线性方程组 二、逆矩阵 1. 方法概述 2. 例16(2) P45 3. 特点 (1) 只适用于系数矩阵必须是方阵且可逆 …...

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…...

React常见面试题目

React常见面试题目详解包括以下几个方面&#xff1a; 1. 对React的理解及特性 定义与用途&#xff1a;React是一个用于构建用户界面的JavaScript库&#xff0c;它遵循组件设计模式、声明式编程范式和函数式编程概念&#xff0c;使得前端应用程序更高效。 核心特性&#xff1a; …...

图解网络OSI模型与TCP/IP

一、OSI模型与TCP/IP 1、OSI模型 OSI/RM&#xff08;Open System Interconnection&#xff0c;开放系统互联参考模型&#xff09;是由ISO&#xff08;国际标准组织&#xff09;创建的一个有助于开放和理解计算机的通信模型&#xff0c;OSI七层参考模型作为一套规范的标准&…...

15分钟学 Python 第31天 :Web Scraping

Day 31&#xff1a;Web Scraping 1. Web Scraping 概述 Web Scraping&#xff08;网页抓取&#xff09;是一种自动提取网站数据的技术。它常用于从网页中收集信息&#xff0c;对数据进行分析和处理。无论是获取产品价格、市场调研&#xff0c;还是收集新闻信息&#xff0c;We…...

前端编程艺术(2)----CSS

目录 1.CSS 2.CSS引入 3.选择器 1.标签选择器 2.类选择器 3.id选择器 4.属性选择器 5.后代选择器 5.直接子元素选择器 6.伪类选择器 链接相关 动态伪类 结构化伪类 否定伪类 其他伪类 UI元素状态伪类 4.字体 1.font-family 2.font-size 3.font-style 4.fo…...

前端的全栈混合之路Meteor篇(二):RPC方法注册及调用

在Meteor 3.0中&#xff0c;RPC&#xff08;远程过程调用&#xff09;机制是实现前后端数据交互的重要特性。通过RPC&#xff0c;前端可以轻松调用后端方法&#xff08;Methods&#xff09;并获取数据&#xff0c;而后端的逻辑也可以同步或异步执行并返回结果。本文将详细介绍M…...

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09;之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定…...

【C++11】新特性

前言&#xff1a; C11 是C编程语言的一个重要版本&#xff0c;于2011年发布。它带来了数量可观的变化&#xff0c;包含约 140 个新特性&#xff0c;以及对 C03 标准中约600个缺陷的修正&#xff0c;更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化&#xff0…...

【游戏模组】重返德军总部2009高清重置MOD,建模和材质全部重置,并且支持光追效果,游戏画质大提升

各位好&#xff0c;今天小编给大家带来一款新的高清重置MOD&#xff0c;本次高清重置的游戏叫《重返德军总部2009》2009年发布&#xff0c;我相信很多玩家已经玩过了&#xff0c;如果你还没有玩过我也可以和你简单介绍一下剧情&#xff0c;这款游戏故事背景接续在《重返德军总部…...