防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就直接显示相关信息了。

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

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

相关文章

基于Hive和Hadoop的招聘分析系统

本项目是一个基于大数据技术的招聘分析系统&#xff0c;旨在为用户提供全面的招聘信息和深入的职位市场分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…

英集芯IP5911:集成锂电池充电管理和检测唤醒功能的低功耗8位MCU芯片

英集芯IP5911是一款集成锂电池充电管理、咪头检测唤醒、负载电阻插拔和阻值检测等功能的8bit MCU芯片。其封装采用QFN16&#xff0c;应用时仅需极少的外围器件&#xff0c;就能够有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型电子设备提供高集成度的解决方…

【常读常悟】《大数据之路-阿里巴巴大数据实践》一书读书摘要

【常读常悟】《大数据之路-阿里巴巴大数据实践》一书读书摘要 1、背景2、目录结构3、数据加工链路4、章节摘要4.1 第2章 日志采集4.1.1 日志采集方案4.1.2 采集指标 4.2 第3章 数据同步4.2.1 数据的特点4.2.2 数据同步的三种方式4.2.3 数据同步的最佳实践 4.3 第4章 离线数据开…

以太网交换安全:端口安全

一、端口安全介绍 端口安全是一种网络设备防护措施&#xff0c;通过将接口学习到的动态MAC地址转换为安全MAC地址&#xff08;包括安全动态MAC和Sticky MAC&#xff09;&#xff0c;阻止除安全MAC和静态MAC之外的主机通过本接口和设备通信&#xff0c;从而增强设备的安全性。以…

基于muduo库函数实现protobuf协议的通信

文章目录 先定义具体的业务请求类型2. 实现服务端提供的服务protobuf_server.cppprotobuf_client.cpp 建议先去了解muduo库和protobuf协议&#xff1a; Protobuf库的使用Muduo库介绍及使用 先定义具体的业务请求类型 先使用protobuf库创建我们所要完成的业务请求类型&#xf…

YOLOv11改进 | 主干篇 | YOLOv11引入MobileNetV4

1. MobileNetV4介绍 1.1 摘要&#xff1a; 我们推出了最新一代的 MobileNet&#xff0c;称为 MobileNetV4 (MNv4)&#xff0c;具有适用于移动设备的通用高效架构设计。 在其核心&#xff0c;我们引入了通用倒瓶颈&#xff08;UIB&#xff09;搜索块&#xff0c;这是一种统一且…

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…

CEPH的写入流程

1、客户端程序发起对文件的读写请求&#xff0c;ceph前端接口&#xff08;RADOS Gateway&#xff09;将文件切分成多个固定大小的对象&#xff08;默认大小为4MB&#xff09; 2、计算文件到对象的映射 (1) 计算OID为每个对象分配一个唯一的OID&#xff08;Object ID&#xff09…

【微服务】初识(day1)

基础概念 集群 集群是将一个系统完整的部署到多个服务器&#xff0c;每个服务器提供系统的所有服务&#xff0c;多个服务器可以通过负载均衡完成任务&#xff0c;每个服务器都可以称为集群的节点。 分布式 分布式是将一个系统拆分为多个子系统&#xff0c;多个子系统部署在…

免费录屏软件工具:助力高效屏幕录制

录屏已经成为了一项非常实用且广泛应用的技术。无论是制作教学视频、记录游戏精彩瞬间&#xff0c;还是进行软件操作演示等&#xff0c;我们都常常需要一款可靠的录屏软件。今天&#xff0c;就让我们一起来探索那些功能强大录屏软件免费版&#xff0c;看看它们是如何满足我们多…

Leecode刷题之路第六天之Z字形变换

题目出处 06-Z字形变换 题目描述 个人解法 思路&#xff1a; todo 代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo 官方解法 06-Z字形变换官方解法 方法1&#xff1a;利用二维矩阵模拟 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&am…

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位&#xff0c;通过硬件过采样扩展到16位&#xff0c;模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道&#xf…

MongoDB微服务部署

一、安装MongoDB 1.在linux中拉去MongoDB镜像文件 docker pull mongo:4.4.18 2. 2.创建数据挂载目录 linux命令创建 命令创建目录: mkdir -p /usr/local/docker/mongodb/data 可以在sshclient工具查看是否创建成功。 进入moogodb目录&#xff0c;给data赋予权限777 cd …

后台管理系统脚手架

后台管理系统脚手架 介绍 在快速迭代的软件开发世界里&#xff0c;时间就是生产力&#xff0c;效率决定成败。对于构建复杂而庞大的后台系统而言&#xff0c;一个高效、可定制的后台脚手架&#xff08;Backend Scaffold&#xff09;无疑是开发者的得力助手。 脚手架 后台脚…

自动驾驶系列—自动驾驶发展史介绍

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

C语言、Eazy_x——井字棋

#include<graphics.h>char board_data[3][3] { { -,-,-},{ -,-,-},{ -,-,-}, };char current_piece o;//检测指定棋子玩家是否获胜 bool CheckWin(char c) {if (board_data[0][0] c && board_data[0][1] c && board_data[0][2] c)return true;if (…

WPS使用越来越卡顿

UOS统信wps频繁的使用后出现卡顿问题&#xff0c;通过删除或重命名kingsoft文件缓存目录。 文章目录 一、问题描述二、问题原因三、解决方案步骤一步骤二步骤三 一、问题描述 用户在频繁的使用wps处理工作&#xff0c;在使用一段时间后&#xff0c;用户反馈wps打开速度慢&…

c++primier第十二章类和动态内存

本章内容包括&#xff1a; 对类成员使用动态内存分配隐式和显式地复制构造函数隐式和显式地重载赋值操作符在构造函数中使用new所必须完成的工作使用静态类成员 将布局new操作符用于对象使用指向对象的指针实现队列抽象数据类型(ADT) 动态内存和类 复习范例和静态类成员 首…

《动手学深度学习》笔记2.2——神经网络从基础→进阶 (参数管理-每层的权重/偏置)

目录 0. 前言 正文&#xff1a;参数管理 1. 参数访问 1.1 [目标参数] 1.2 [一次性访问所有参数] 1.3 [从嵌套块收集参数] 2. 参数初始化 2.1 [内置初始化] 2.2 [自定义初始化] 2.3 [参数绑定-共享参数] 3. 小结&#xff08;第2节&#xff09; 4. 延后初始化 (原书第…

AR 眼镜之-蓝牙电话-来电铃声与系统音效

目录 &#x1f4c2; 前言 AR 眼镜系统版本 蓝牙电话 来电铃声 系统音效 1. &#x1f531; Android9 原生的来电铃声&#xff0c;走的哪个通道&#xff1f; 2. &#x1f4a0; Android9 原生的来电铃声&#xff0c;使用什么播放&#xff1f; 2.1 来电铃声创建准备 2.2 来…