网络安全SQL注入

HTML & Vue.js 结合使用

HTML 是网页的基础结构语言,而 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。结合两者,你可以创建动态、响应式的Web应用程序。Vue.js通过指令(如v-bind, v-if, v-for)无缝集成到HTML中,使得数据绑定和页面逻辑变得更加直观。

示例

<div id="app">
  <h1>{{ message }}</h1>
  <input v-model="message">
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello Vue!'
    }
  })
</script>

 

Vue.js 与 Spring Boot 后端集成

在前后端分离的架构中,Vue.js 负责前端展示与交互,而 Spring Boot 提供后端服务。两者通常通过API进行通信,常用的技术栈包括 RESTful API 和 Axios(Vue端的HTTP库)。

Vue.js 请求Spring Boot API示例

axios.get('http://localhost:8080/api/users')
  .then(response => {
    this.users = response.data;
  })
  .catch(error => {
    console.error("Error fetching data: ", error);
  });

MyBatis 与 Spring Boot 集成

MyBatis 是一个优秀的持久层框架,它支持自定义SQL,可以将SQL查询映射到Java对象。在Spring Boot中,通过MyBatis-Spring-Boot-Starter可以轻松集成。

配置示例application.ymlapplication.properties):

mybatis.type-aliases-package=com.example.demo.entity
mybatis.mapper-locations=classpath:mapper/*.xml

Java 重写与重载

  • 重写(Overriding):在继承关系中,子类可以提供一个与其父类方法签名完全相同的方法实现。这允许子类改变父类的行为。重写要求方法名、参数列表、返回类型必须与父类方法一致,且访问权限不能比父类更严格。

  • 重载(Overloading):发生在同一个类中,方法名相同但参数列表不同(参数类型、数量或顺序不同)。重载方法可以有不同的返回类型,但这是根据参数列表区分的,而不是返回类型。

MyBatis 自定义类型处理器

自定义类型处理器允许你改变MyBatis处理特定类型数据的方式,例如,自定义字符串类型处理器来处理特殊格式的数据。

示例

package com.example.mapper.handlers;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(String.class)
public class CustomStringTypeHandler extends BaseTypeHandler<String> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, customProcess(parameter));
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return customProcess(rs.getString(columnName));
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return customProcess(rs.getString(columnIndex));
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return customProcess(cs.getString(columnIndex));
    }

    private String customProcess(String input) {
        // 在这里实现你的自定义处理逻辑
        return input.toUpperCase(); // 示例:将字符串转为大写
    }
}

通过以上示例,你可以看到如何将这些技术结合起来,构建一个从前端展示到后端数据处理的完整Web应用流程。从Vue.js的前端界面到Spring Boot后端服务,再到MyBatis处理数据库交互,每一步都是现代Web应用开发的关键环节。

在Web应用开发中,Thymeleaf 作为模板引擎常用于Spring Boot项目中,Vue.js 则用于构建动态的前端界面。当结合MyBatis和Spring Boot后端进行数据库操作时,防范SQL注入攻击是至关重要的。以下是一个结合Thymeleaf、Vue.js、MyBatis和Spring Boot的示例,通过一个登录功能,来具体说明SQL注入攻击及其预防方法。

前端(Vue.js 或 Thymeleaf)

首先,我们看前端如何接收用户输入并提交到后端。

<!-- login.vue -->
<template>
  <form @submit.prevent="login">
    <input type="text" v-model="username" placeholder="Username" />
    <input type="password" v-model="password" placeholder="Password" />
    <button>Login</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    async login() {
      await axios.post('/api/login', { username: this.username, password: this.password });
    }
  }
};
</script>
Thymeleaf 示例
<!-- login.html -->
<form th:action="@{/api/login}" method="post">
  <input type="text" name="username" placeholder="Username" />
  <input type="password" name="password" placeholder="Password" />
  <button type="submit">Login</button>
</form>

后端(Spring Boot + MyBatis)

后端接收到前端提交的数据后,需要正确处理以防止SQL注入。

// UserController.java
@PostMapping("/api/login")
public ResponseEntity<?> login(@RequestParam String username, @RequestParam String password) {
    User user = userService.login(username, password);
    if (user != null) {
        return ResponseEntity.ok("Login successful");
    } else {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
    }
}

// UserService.java
public User login(String username, String password) {
    String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
    return jdbcTemplate.queryForObject(query, new UserRowMapper());
}
安全的示例(使用MyBatis)

使用MyBatis的Mapper接口和PreparedStatement来防止SQL注入。

// UserMapper.java
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
    User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}

// UserService.java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User login(String username, String password) {
        return userMapper.findByUsernameAndPassword(username, password);
    }
}

表结构设计参考

CREATE TABLE `users` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL, -- 实际存储的是密码的哈希值
  `email` VARCHAR(255),
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`) -- 确保用户名唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

实体类设计

package com.example.demo.entity;

import java.time.LocalDateTime;

public class User {
    private Integer id;
    private String username;
    private String password; // 存储的是密码的哈希值
    private String email;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // Getter and Setter methods
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password; // 实际应用中,这里应该是设置密码的哈希值
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }

    public LocalDateTime getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(LocalDateTime updatedAt) {
        this.updatedAt = updatedAt;
    }
}

请注意,在实际应用中,密码不应明文存储,而是存储其哈希值。此外,为了进一步增强安全性,可以考虑使用加盐哈希(salted hash)或更现代的密码散列函数,如BCrypt。

SQL注入解释

在不安全的示例中,直接拼接SQL字符串,如果用户输入为 admin' OR '1'='1 作为用户名,任何密码都会导致SQL语句变为

 WHERE username = 'admin' OR '1'='1' AND password = '...'

,因为 '1'='1' 永远为真,所以该查询会匹配所有用户,造成SQL注入攻击。

而在安全示例中,通过MyBatis的#{}语法和PreparedStatement,框架会自动对参数进行转义,确保特殊字符被安全处理,防止了SQL注入的发生。

结合Vue.js或Thymeleaf的前端界面,使用Spring Boot和MyBatis构建后端时,务必采用参数化查询来防止SQL注入,确保应用的安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java数组深度剖析:掌握数据结构的基石

引言 在编程世界中&#xff0c;数仅仅是一种数据类型&#xff0c;它是理解内存分配、多维数据处理以及性能优组像是构建复杂数据结构的基本积木。它们简洁、高效&#xff0c;是管理元素集的首选方式。在Java中&#xff0c;数组不化的关键。 这篇文章致力于深入探讨Java数组的各…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

【二】电力系统规约IEC 104详解

电力系统规约IEC 104详解 概述 很早就准备梳理出一下电力系统规约系列的文章&#xff0c;因为自己在实践过程中发现这方面太难找了&#xff0c;网上的资料也都比较陈旧。我接触和使用IEC系列规约也有一段时间了&#xff0c;本着总结和分享的想法&#xff0c;我想推出这系列的文…

在线的调试器pythontutor,支持C/C++

1. 背景介绍 对于C语言的学习最复杂的可能无疑就是指针的&#xff0c;指针因其灵活、晦涩难懂等特点而出名&#xff0c;本文并不介绍利用gdb的角度去分析它&#xff0c;而是通过一个在线网站而分析&#xff1b; 2.C代码调试 3. C代码调试 4在线网站 https://pythontutor.com/…

【项目纪实】某国有航空公司人力资源系统诊断咨询项目

公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.3--Cortex-A7寄存器介绍

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Numerical Analysis(byRichard.L..Burden)【pdf高清英文原版】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

HarmonyOS 4.0(鸿蒙开发)01 - 怎么学习鸿蒙引导篇

作为公司的全栈开发工程师 以及 未来的发展是有鸿蒙这个阶段的&#xff0c;以及本身具有这个技术栈由此后续会分享自己在实战中学习到的东西&#xff0c;碰到的bug都会分享出来&#xff0c;这是引导篇期待后续的更新 学习目标&#xff1a; 理解HarmonyOS操作系统的架构和开发…

目标检测算法YOLOv3简介

YOLOv3由Joseph Redmon等人于2018年提出&#xff0c;论文名为&#xff1a;《YOLOv3: An Incremental Improvement》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1804.02767.pdf &#xff0c;项目网页&#xff1a;https://pjreddie.com/darknet/yolo/ 。YOLOv3是对YOL…

解决IDEA下springboot项目打包没有主清单属性

1.问题出现在SpringBoot学习中 , 运行maven打包后无法运行 报错为spring_boot01_Demo-0.0.1-SNAPSHOT.jar中没有主清单属性 SpringBoot版本为 2.6.13 Java 版本用的8 解决方法 1.执行clean 删除之前的打包 2.进行打包规范设置 2.1 3.进行问题解决 (借鉴了阿里开发社区) 使用…

利用PDAL2.7.1 实现点云滤波

利用PDAL2.7.1 实现点云滤波 本文介绍利用PDAL实现点云滤波方法&#xff0c;包含pipeline命令行运行、C代码两种方法&#xff0c;C代码分别介绍对点云文件进行滤波、点云全部在内存中进行滤波的pdal两种调用方法。并简单探究pdal的设计结构。 目录 1 pipeline命令调用方法2 文…

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接&#xff1a;https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置&#xff08;R语言的工作路径&#xff09; getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

飞腾D2000+X100 TYPE6全国产核心板

飞腾D2000X100 TYPE6核心板 产品概述 飞腾D2000X100 TYPE6核心板为增强型自主控制器核心板&#xff0c;其核心芯片CPU采用飞腾D2000/8核工业版CPU、飞腾桥片X100、双通道DDR4L插槽、PHY芯片等。 产品特点 l 基于飞腾D2000X100桥片 l 丰富的PCIE扩展资源&#xff0c;一路PCIE…

C++入门系列-函数重载

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 函数重载 自然语言当中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。 函数重载的概念 函数重载&#x…

A4的PDF按A3打印

先用办公软件打开&#xff0c;比如WPS。 选择打印-属性。 纸张选A3&#xff0c;如果是双面打印&#xff0c;选短边装订&#xff0c;然后在版面-页面排版-每张页数&#xff08;N合1&#xff09;选2。 不同打印机的具体配置可能不一样&#xff0c;但大体都是这个套路。

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

中兴ZXV10 B860AV2.1机顶盒刷机

移动的电视盒子如果不续费&#xff0c;连桌面都进不去&#xff0c;趁着五一有空把系统刷了。整体上比较顺利。 注意这个盒子只有两个螺丝&#xff0c;盒子上已经标识&#xff0c;如上图左上角和右下角。盒子里面有卡扣&#xff0c;卸掉螺丝直接扣是很难打开的&#xff0c;需要用…

【CLion】clion无法加载或找不到cmakekists文件

一、问题表象 最近工作中&#xff0c;在git pull远程仓库最新版本程序后&#xff0c;平时打开CLion自动加载的工程CMakeLists文件突然失效&#xff08;显示找不到可编译的文件&#xff09;&#xff0c;无法debug程序。 二、原因分析 基于平时的编码经验和之前git pull也出现…

深度学习之基于CIFAR10图像分类可视化

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习之基于CIFAR-10图像分类可视化项目简介 一、项目背景 随着深度学习和计算机视觉技术的飞速发展&#xff…

边缘计算含义与应用简析

边缘计算概述 边缘计算使数据存储和处理靠近生成或收集数据的位置&#xff0c;而不是在位于数千公里的服务器上。它将通过保持灵活性在边缘无缝可靠地部署服务。它比云计算更安全&#xff0c;因为不需要传输数据。因此&#xff0c;在将数据从边缘移动到云端时&#xff0c;不用…
最新文章