网络安全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> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, customProcess(parameter));}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return customProcess(rs.getString(columnName));}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return customProcess(rs.getString(columnIndex));}@Overridepublic 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 {@Autowiredprivate 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 methodspublic 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.mzph.cn/pingmian/5205.shtml

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

相关文章

统一化数据库:为大语言模型垂域应用奠定基础

编者按&#xff1a;检索增强生成&#xff08;RAG&#xff09;技术因在减少生成幻觉和虚构信息方面的显著效果&#xff0c;以及对知识及时更新能力的改善&#xff0c;正逐渐成为大语言模型系统的主流架构之一。随着 RAG 技术的广泛应用&#xff0c;其核心组件——向量数据库&…

2022 csp-j 答案(精选题)

主题目 16 - 21题 22 - 27题 28 - 34题 35 -39题 40 - 44题 精选题目 答案及解析 28题 答案&#xff1a;T 解析&#xff1a;考查时间复杂度评估。 31题 答案&#xff1a;A 解析&#xff1a;模拟即可。 32题 答案&#xff1a;B 解析&#xff1a;模拟即可。 34题 答…

Android 学习 鸿蒙HarmonyOS 4.0 第一天

1.1系统定位 1.1.1系统定位 HarmonyOS 是一款面向万物互联时代的&#xff0c;全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;HarmonyOS 提出了基于同一套系统能力&#xff0c;适配多种终端形态的分布式理念&#xff0c;能支持手机&#xff0c;平板&#xf…

线上线下包搭建小程序/公众号/H5 支持二开!

网上交友有以下三个积极影响&#xff1a; 1. 扩展社交圈和增加社交机会&#xff1a;网上交友可以让人们接触到不同地区、不同背景、不同文化的人&#xff0c;拓展人们的社交圈并且增加交友机会。这些新的社交联系对于个人的成长和发展有积极的影响&#xff0c;可以让人们学习新…

线阵相机和面阵相机简介

线阵相机 线阵相机&#xff0c;顾名思义就是所探测的物体要在一个很长的界面上。线阵相机的传感器只有一行感光像素&#xff0c;所以线阵相机一般具有非常高的扫描频率和分辨率。 线阵相机特点 线阵相机使用的线扫描传感器通常只有一行感光单元&#xff08;少数彩色线阵使用…

国内各种免费AI聊天机器人(ChatGPT)推荐(上)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月27日11点25分 欢迎来到AI聊天机器人推荐系列的第一篇文章&#xff01; 在这个系列中&#xff0c;我将引领您探索国内各种AI聊天机器人的精彩世界。 从…

k8s-身份认证与权限

认证概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 在Kubernetes集群中&#xff0c;客户端通常有两类&#xff1a; User Account&#xff1a;一般是独…

动态规划:0/1背包问题

01背包问题是一个经典的动态规划问题&#xff0c;它询问在给定的物品和背包容量下&#xff0c;如何选择物品使得背包中的物品总价值最大&#xff0c;同时保证不超过背包的容量限制。物品不能分割&#xff0c;每个物品只能选择放入或不放入背包。 问题定义 输入&#xff1a; 物…

基于FPGA的数字信号处理(4)--浮点数的定点化

写在前面 首先要说明的是&#xff0c;题目《浮点数的定点化》中所谓的 浮点数 并不是指 IEEE754 规定的 单精度浮点数 或者 双精度浮点数 等格式&#xff0c;而是指10进制小数。所以说白了&#xff0c;这篇文章要讲的就是如何将10进制小数采用定点数的形式表示。 为什么2进制无…

Python新手入门基础英文笔记

1、字符串的操作 user&#xff1a;用户 name&#xff1a;名称/姓名 attibute&#xff1a;字段/属性 Value&#xff1a;值 2、重复/转换/替换/原始字符号 upper&#xff1a;上面 lower&#xff1a;下面 capitalize&#xff1a;用大写字母写或印刷 title&#xff1a;标题…

03、第一个 Java 程序运行过程以及运行过程中常见的问题及解决方案

第一个 Java 程序运行 1、新建文本文件并以 .java 结尾&#xff1a;其一、第一个 java 程序的代码为&#xff1a;其二、代码截图为&#xff1a; 2、 .java 文件编译的过程&#xff1a;其一、将 Java 代码编写到扩展名为 .java 的文件中(即&#xff1a;源文件)&#xff1a;其二、…

若依前后端分离版 集成 腾讯云 COS

原因&#xff1a; 最近在根据一个若依二开的项目继续进行开发&#xff0c;当添加到轮播图模块的时候&#xff0c;涉及到了图片上传&#xff0c;由于公司以前一直使用的是腾讯云COS&#xff08;不是阿里云OSS&#xff09;&#xff0c;在网上搜索一番后&#xff0c;没有找到 若依…

【笔记目录】

目录 001、流程 - - 入金申请 002、流程 - - 出金申请 003、流程 - - 用户注册 004、关系 - - 客服业绩统计报表 005、单词 - - 业务单词

亚信安慧AntDB:挑战的创新之道

在当今快速变化的商业环境中&#xff0c;企业需要能够快速适应业务需求的变化&#xff0c;并能够实现数据的实时更新和处理&#xff0c;以便及时获取最新信息和洞察。AntDB作为一种创新的数据库解决方案&#xff0c;正是能够满足这些需求的利器。 AntDB以其强大的功能和灵活的…

浏览器原理---浏览器本地存储

1、浏览器本地存储方式及使用场景 &#xff08;1&#xff09;Cookie Cookie是最早被提出来的本地存储方式&#xff0c;在此之前&#xff0c;服务端是无法判断网络中的两个请求是否是同一用户发起的&#xff0c;为解决这个问题&#xff0c;Cookie就出现了。Cookie的大小只有4kb&…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 &#xff1a; 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代&#xff0c;数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库&#xff0c;在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

【SpringBoot】数据脱敏

文章目录 什么是数据脱敏JsonSerialize自定义Jackson注解定制脱敏策略定制JSON序列化实现脱敏工具类 定义Person类&#xff0c;对其数据脱敏模拟接口测试总结 什么是数据脱敏 数据脱敏&#xff0c;也称为数据的去隐私化或数据变形&#xff0c;是一种技术手段&#xff0c;用于对…

vue各种时间类型转换

时间范围[2024-04-17 14:36:27, 2024-04-24 14:36:27] console.log(this.$getRecentDays()); 页面使用默认7天 也可以指定console.log(this.$getRecentDays(30)); [2024-04-17 14:36:27, 2024-04-24 14:36:27] 默认值 function getDateString (date, fmt yyyy-MM-dd) {if…

【问题实操】银河高级服务器操作系统实例分享,配置hugepages启动异常

1.问题现象 某运营商国产服务器操作系统项目&#xff0c;部署Kylin-Server-0524-aarch64服务器系统&#xff0c;内核从4.19.90-24.4升级到4.19.90-25.14。在grub中配置huagepages大页内存后&#xff0c;系统在内核启动阶段黑屏&#xff0c;只显示一个光标。grub配置如下图&…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…