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

【基础篇】什么是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 注入攻击,应该采取以下措施:

  1. 使用参数化查询(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' 被当作字符串值,将 ' 转义为 \'

  2. 使用 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';
    
  3. 输入验证和过滤: 对于用户输入,要进行验证和过滤,确保只有合法的数据被用于数据库查询。

  4. 最小权限原则: 数据库用户应该具有最小的权限来执行必要的操作,这样即使发生 SQL 注入,攻击者也无法进行敏感的操作。

    -- 示例:数据库用户只有查询权限,没有更新和删除权限
    GRANT SELECT ON users TO read_only_user;
    
  5. 错误处理: 在应用程序中不要直接返回数据库错误信息给用户,以免攻击者获得有关数据库结构的敏感信息。

  6. 定期更新和维护: 定期更新和维护数据库和应用程序,确保已知的漏洞得到修复。

何为预编译?

预编译(Prepared Statements)是一种数据库查询优化技术,在执行SQL查询之前,数据库管理系统会将SQL查询语句预先编译成一种内部表示形式,然后将参数值与预编译的查询计划进行绑定。

相关文章:

【基础篇】什么是SQL注入,如何防止?

什么是 SQL 注入&#xff0c;如何防止&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它发生在 Web 应用程序中&#xff0c;当恶意用户在输入数据时&#xff0c;将恶意的 SQL 代码插入到输入中&#xff0c;从而导致应用程序…...

Swift语言的数据结构

Swift语言的数据结构 Swift是一种现代化的编程语言&#xff0c;它以安全性、性能和简洁性著称。尽管Swift通常被视为面向对象的语言&#xff0c;但它也支持函数式编程的特性&#xff0c;使得开发者可以以多种方式构建应用程序。在Swift中&#xff0c;数据结构是编程的基础&…...

牛客周赛 Round 77

题目链接&#xff1a;牛客周赛 Round 77 A. 时间表 tag&#xff1a;签到 B. 数独数组 tag&#xff1a;签到 Description&#xff1a;给定n个数&#xff0c;每个数的范围为1-9&#xff0c;问能否经过排列&#xff0c;使其每个长度为9的连续子数组都包含1-9这9个数字。 Sol…...

浅谈云端编辑器,分析其亮点与不足

浅谈云端编辑器&#xff0c;分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析&#xff1a; 1. 左侧题目筛选栏 层次结构清晰&#xff1a;左侧栏展示了一个层级结构&#xff0c;题目按主题分…...

web应用引入cookie机制的用途和cookie技术主要包括的内容

web应用引入cookie机制&#xff0c;用于用户跟踪。 &#xff08;1&#xff09;HTTP响应报文中的Cookie头行&#xff1a;set-Cookie &#xff08;2&#xff09;用户浏览器在本地存储、维护和管理的Cookie文件 &#xff08;3&#xff09;HTTP请求报文中的Cookie头行&#xff1a;…...

【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日&#xff0c;2024年博客之星入围公布&#xff0c;很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年&#xff0c;是意义非凡的一年&#xff0c;是充…...

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超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…...

京华春梦,守岁这方烟火人间

文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低&#xff0c;室外通常在零下几度到零上几度之间…...

学Python的人…

学Python的人… 一、Python能干什么&#xff1f; 1.爬虫&#xff1a;前几年&#xff0c;深度学习还没发展起来的时候&#xff0c;书店里Python就和爬虫挂钩&#xff0c;因为Python写爬虫确实方便。 2.数据分析&#xff1a;Python有各种的数据分析库可以方便使用&#xff0…...

WebSocket 和 Socket 的区别

一、协议层次和工作方式 1.1 &#xff09;Socket 1.1.1&#xff09;Socket位于传输层&#xff0c;通常使用TCP或UDP协议 1.1.2&#xff09;提供了一个通用的网络编程接口&#xff0c;允许应用程序通过它发送和接收数据 1.1.3&#xff09;一般需要手动管理连接&#xff0c;错…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…...

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户&#xff08;如果用户有一万条数据呢&#xff09;&#xff0c;而是分页展示给用户&#xff0c;这就是分页查询…...

【优选算法】4----盛最多水的容器

开始有点上强度了铁子们&#xff0c;这道算法题也是可以说很难理解的~ 想了好久才想明白~ ---------------------------------------begin--------------------------------------- 题目解析&#xff1a; 这一道题刚看题目&#xff0c;根本不知道在讲啥&#xff0c;但看到体积…...

EDI安全:2025年数据保护与隐私威胁应对策略

在数字化转型的浪潮中&#xff0c;电子数据交换&#xff08;EDI&#xff09;已成为企业间信息传递的核心基础设施。然而&#xff0c;随着数据规模的指数级增长和网络威胁的日益复杂化&#xff0c;EDI安全正面临前所未有的挑战。展望2025年&#xff0c;企业如何构建一套全面、高…...

代码随想录刷题day13|(链表篇)24.两两交换链表中的结点

目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可&#xff0c;有两个关键点&#xff0c;一是循环何时终止&#xff1f;终止…...

集群、分布式及微服务间的区别与联系

目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中&#xff0c;这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…...

web前端3--css

注意&#xff08;本文一切代码一律是在vscode中书写&#xff09; 1、书写位置 1、行内样式 //<标签名 style"样式声明"> <p style"color: red;">666</p> 2、内嵌样式 1、style标签 里面写css代码 css与html之间分离 2、css属性:值…...

Mirage Flow 长期记忆能力测试与应用场景探索

Mirage Flow 长期记忆能力测试与应用场景探索 最近&#xff0c;我花了不少时间折腾一个叫Mirage Flow的模型。说实话&#xff0c;最开始吸引我的不是什么花哨的功能&#xff0c;而是它宣传的那个“长上下文窗口”能力。简单说&#xff0c;就是它能记住很长的对话内容&#xff…...

PixEz-flutter网络优化实战:3个技巧打造流畅的二次元内容体验

PixEz-flutter网络优化实战&#xff1a;3个技巧打造流畅的二次元内容体验 【免费下载链接】pixez-flutter 一个支持免代理直连及查看动图的第三方Pixiv flutter客户端 项目地址: https://gitcode.com/gh_mirrors/pi/pixez-flutter 作为一款支持免代理直连的第三方Pixiv客…...

3个维度解析Helix Toolkit:跨平台3D渲染框架的技术突破与商业价值

3个维度解析Helix Toolkit&#xff1a;跨平台3D渲染框架的技术突破与商业价值 【免费下载链接】helix-toolkit Helix Toolkit is a collection of 3D components for .NET. 项目地址: https://gitcode.com/gh_mirrors/he/helix-toolkit Helix Toolkit是一套功能完备的.N…...

第09课:10个高频场景 Prompt 模板库,复制、改几个词、直接用

阅读时长&#xff1a;约25分钟 难度&#xff1a;★★☆☆☆&#xff08;使用难度低&#xff0c;但信息密度高&#xff09; 适合人群&#xff1a;所有已完成地基篇的开发者——不管你是否学完了核心技能篇的每一课 学完之后&#xff1a;面对10种最常见的开发任务&#xff0c;你都…...

7天精通小红书数据采集:高效破解反爬机制的实战指南

7天精通小红书数据采集&#xff1a;高效破解反爬机制的实战指南 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs &#x1f6a8; 数据采集的三大技术痛点与破解之道 在当今数…...

QMCDecode终极指南:3步解锁QQ音乐加密文件的完整解决方案

QMCDecode终极指南&#xff1a;3步解锁QQ音乐加密文件的完整解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

4步实现代码块专业化管理:技术文档效率提升指南

4步实现代码块专业化管理&#xff1a;技术文档效率提升指南 【免费下载链接】obsidian-better-codeblock Add title, line number to Obsidian code block 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-better-codeblock 在技术文档创作过程中&#xff0c;代码…...

MTKClient实战指南:从环境搭建到故障排查的完整路径

MTKClient实战指南&#xff1a;从环境搭建到故障排查的完整路径 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient作为一款专注于联发科芯片组设备的开源工具配置方案&#xff0c;提…...

远离 8 种有毒人际关系,守住自身能量与运势

身处社会中&#xff0c;若长期接触 “有毒的人”&#xff0c;个人能量会被持续吞噬&#xff0c;运势也会受负面影响&#xff0c;这 8 类有毒的人际关系需果断远离。不赚钱的人会成为发展的阻碍&#xff0c;甚至心生异心拖垮他人&#xff0c;赚钱后需减少与其交集。不能滋养自己…...

Phi-4-mini-reasoning集成Visual Studio Code:智能代码补全与调试插件开发

Phi-4-mini-reasoning集成Visual Studio Code&#xff1a;智能代码补全与调试插件开发 1. 为什么开发者需要AI驱动的IDE插件 现代软件开发正变得越来越复杂&#xff0c;开发者每天要面对海量代码库、频繁的上下文切换和层出不穷的新技术。传统IDE虽然提供了基础补全功能&…...