【基础篇】什么是SQL注入,如何防止?
什么是 SQL 注入,如何防止?
SQL 注入(SQL Injection)是一种常见的网络安全漏洞,它发生在 Web 应用程序中,当恶意用户在输入数据时,将恶意的 SQL 代码插入到输入中,从而导致应用程序执行非预期的 SQL 查询。
攻击者通过 SQL 注入可以访问、修改或删除数据库中的数据,甚至完全控制数据库。
SQL 注入的原因是:未经适当验证和处理的用户输入被直接拼接到 SQL 查询语句中,使得攻击者可以修改 SQL 查询的逻辑。例如,一个简单的登录查询可能是这样的:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
如果应用程序未对用户输入进行适当的验证和处理,攻击者可以输入以下内容:
输入的用户名: ' OR '1'='1
输入的密码: ' OR '1'='1
那么构造出的 SQL 查询就变成了:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
由于 '1'='1' 始终为真,上述查询将返回数据库中所有用户的信息,绕过了正常的身份验证。
为了防止 SQL 注入攻击,应该采取以下措施:
-
使用参数化查询(Prepared Statements): 参数化查询是一种预编译 SQL 语句,参数值与 SQL 语句分开,不会将用户输入直接拼接到 SQL 语句中,从而避免了 SQL 注入的风险。
// 使用PreparedStatement预编译SQL查询语句,避免SQL注入的风险 String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; // 创建PreparedStatement对象,并将SQL语句传入 PreparedStatement pstmt = connection.prepareStatement(sql);// 设置参数值,参数索引从1开始 // 将用户输入的用户名设置到第一个参数位置(索引1) pstmt.setString(1, userInputUsername); // 将用户输入的密码设置到第二个参数位置(索引2) pstmt.setString(2, userInputPassword);// 执行查询,并将查询结果保存到ResultSet对象中 ResultSet resultSet = pstmt.executeQuery();结果:
SELECT * FROM users WHERE username = '\' OR \'1\'=\'1\'' AND password = '\' OR \'1\'=\'1\'';' OR '1'='1'被当作字符串值,将'转义为\'。 -
使用 ORM 框架: 对象关系映射(ORM)框架如 Hibernate、MyBatis 等,可以自动处理 SQL 查询,避免手动拼接 SQL 语句,从而减少了 SQL 注入的可能性。
<!-- 示例:MyBatis映射配置文件 --> <!-- 在MyBatis的映射配置文件中,通过使用#{}语法来进行参数化查询,MyBatis会自动对参数值进行转义,以防止SQL注入。 --> <select id="getUserByUsernameAndPassword" resultType="User">SELECT * FROM users WHERE username = #{username} AND password = #{password} </select>在这个查询中,
' OR '1'='1'被当作字符串值,而不是 SQL 代码。输入
输入的用户名: ' OR '1'='1 输入的密码: ' OR '1'='1最终 sql 语句会变为:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'; -
输入验证和过滤: 对于用户输入,要进行验证和过滤,确保只有合法的数据被用于数据库查询。
-
最小权限原则: 数据库用户应该具有最小的权限来执行必要的操作,这样即使发生 SQL 注入,攻击者也无法进行敏感的操作。
-- 示例:数据库用户只有查询权限,没有更新和删除权限 GRANT SELECT ON users TO read_only_user; -
错误处理: 在应用程序中不要直接返回数据库错误信息给用户,以免攻击者获得有关数据库结构的敏感信息。
-
定期更新和维护: 定期更新和维护数据库和应用程序,确保已知的漏洞得到修复。
何为预编译?
预编译(Prepared Statements)是一种数据库查询优化技术,在执行SQL查询之前,数据库管理系统会将SQL查询语句预先编译成一种内部表示形式,然后将参数值与预编译的查询计划进行绑定。
相关文章:
【基础篇】什么是SQL注入,如何防止?
什么是 SQL 注入,如何防止? SQL 注入(SQL Injection)是一种常见的网络安全漏洞,它发生在 Web 应用程序中,当恶意用户在输入数据时,将恶意的 SQL 代码插入到输入中,从而导致应用程序…...
Swift语言的数据结构
Swift语言的数据结构 Swift是一种现代化的编程语言,它以安全性、性能和简洁性著称。尽管Swift通常被视为面向对象的语言,但它也支持函数式编程的特性,使得开发者可以以多种方式构建应用程序。在Swift中,数据结构是编程的基础&…...
牛客周赛 Round 77
题目链接:牛客周赛 Round 77 A. 时间表 tag:签到 B. 数独数组 tag:签到 Description:给定n个数,每个数的范围为1-9,问能否经过排列,使其每个长度为9的连续子数组都包含1-9这9个数字。 Sol…...
浅谈云端编辑器,分析其亮点与不足
浅谈云端编辑器,分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析: 1. 左侧题目筛选栏 层次结构清晰:左侧栏展示了一个层级结构,题目按主题分…...
web应用引入cookie机制的用途和cookie技术主要包括的内容
web应用引入cookie机制,用于用户跟踪。 (1)HTTP响应报文中的Cookie头行:set-Cookie (2)用户浏览器在本地存储、维护和管理的Cookie文件 (3)HTTP请求报文中的Cookie头行:…...
【HTML+CSS】使用HTML与后端技术连接数据库
目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…...
「2024·我的成长之路」:年终反思与展望
文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日,2024年博客之星入围公布,很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年,是意义非凡的一年,是充…...
C#PaddleOCRSharp使用
using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…...
【Excel】【VBA】Reaction超限点筛选与散点图可视化
【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能: 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…...
京华春梦,守岁这方烟火人间
文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低,室外通常在零下几度到零上几度之间…...
学Python的人…
学Python的人… 一、Python能干什么? 1.爬虫:前几年,深度学习还没发展起来的时候,书店里Python就和爬虫挂钩,因为Python写爬虫确实方便。 2.数据分析:Python有各种的数据分析库可以方便使用࿰…...
WebSocket 和 Socket 的区别
一、协议层次和工作方式 1.1 )Socket 1.1.1)Socket位于传输层,通常使用TCP或UDP协议 1.1.2)提供了一个通用的网络编程接口,允许应用程序通过它发送和接收数据 1.1.3)一般需要手动管理连接,错…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)
重新创建WebApi项目,安装Microsoft.AspNetCore.Authentication.JwtBearer包,将之前JwtBearer测试项目中的初始化函数,jwt配置类、token生成类全部挪到项目中。 重新编写login函数,之前测试Cookie和Session认证时用的函数适合m…...
【SpringBoot】SpringBoot中分页插件(PageHelper)的使用
目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户(如果用户有一万条数据呢),而是分页展示给用户,这就是分页查询…...
【优选算法】4----盛最多水的容器
开始有点上强度了铁子们,这道算法题也是可以说很难理解的~ 想了好久才想明白~ ---------------------------------------begin--------------------------------------- 题目解析: 这一道题刚看题目,根本不知道在讲啥,但看到体积…...
EDI安全:2025年数据保护与隐私威胁应对策略
在数字化转型的浪潮中,电子数据交换(EDI)已成为企业间信息传递的核心基础设施。然而,随着数据规模的指数级增长和网络威胁的日益复杂化,EDI安全正面临前所未有的挑战。展望2025年,企业如何构建一套全面、高…...
代码随想录刷题day13|(链表篇)24.两两交换链表中的结点
目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可,有两个关键点,一是循环何时终止?终止…...
集群、分布式及微服务间的区别与联系
目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中,这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...
MySQL(4)多表查询
引言:为什么需要多表的查询? A:提高效率,多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询: SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…...
web前端3--css
注意(本文一切代码一律是在vscode中书写) 1、书写位置 1、行内样式 //<标签名 style"样式声明"> <p style"color: red;">666</p> 2、内嵌样式 1、style标签 里面写css代码 css与html之间分离 2、css属性:值…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
