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

mysql学习教程,从入门到精通,SQL 注入(42)

1、 SQL 注入

SQL 注入是一种严重的安全漏洞,它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害,我不能提供具体的恶意代码示例。然而,我可以向你展示如何防御 SQL 注入,并解释其工作原理,以便你能够识别和防范这种攻击。

1.1、SQL 注入的工作原理

SQL 注入通常发生在应用程序将用户输入直接嵌入到 SQL 查询中,而没有进行适当的验证或转义。攻击者可以通过在输入字段中插入恶意的 SQL 代码,从而改变查询的意图。

例如,假设有一个简单的登录表单,其 SQL 查询可能如下所示:

SELECT * FROM users WHERE username = 'admin' AND password = 'password';

如果应用程序直接将用户输入拼接到这个查询中,而没有进行任何处理,那么攻击者可以通过输入特定的值来操纵查询。例如,攻击者可以在用户名字段中输入 ' OR '1'='1,从而将查询变为:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password';

由于 '1'='1' 总是为真,这个查询将返回数据库中的所有用户,从而绕过身份验证。

1.2、防御 SQL 注入

  1. 使用预处理语句和参数化查询
    预处理语句允许数据库引擎将 SQL 代码与数据分开处理,从而防止 SQL 注入。在大多数编程语言中,都有支持预处理语句的数据库库。

    例如,在 Python 中使用 sqlite3 库:

    import sqlite3conn = sqlite3.connect('example.db')
    cursor = conn.cursor()username = input("Enter username: ")
    password = input("Enter password: ")cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
    results = cursor.fetchall()if results:print("Login successful!")
    else:print("Invalid username or password.")conn.close()
    
  2. 使用 ORM(对象关系映射)
    ORM 框架如 SQLAlchemy(Python)、ActiveRecord(Ruby)等,通常会自动处理参数化查询,从而减少 SQL 注入的风险。

  3. 输入验证和清理
    虽然输入验证和清理不能单独防止 SQL 注入,但它们可以作为额外的安全措施。确保所有用户输入都符合预期格式,并拒绝任何可疑输入。

  4. 最小权限原则
    确保数据库用户只拥有执行其任务所需的最低权限。这限制了攻击者即使成功进行 SQL 注入,所能造成的损害。

  5. 使用 Web 应用防火墙(WAF)
    WAF 可以监控和过滤 HTTP 流量,识别并阻止潜在的 SQL 注入攻击。

  6. 定期安全审计和测试
    定期对应用程序进行安全审计和渗透测试,以识别并修复潜在的安全漏洞。

通过遵循这些最佳实践,你可以大大降低 SQL 注入攻击的风险,并保护你的应用程序和数据免受损害。

以下是一些具体的SQL注入攻击案例:

案例一:数字型注入

  • 场景:在浏览器地址栏输入URL,如http://learn.me/sql/article.php?id=1,这是一个GET型接口,发送请求相当于调用查询语句sql = "SELECT * FROM article WHERE id = "
  • 攻击方式:如果在浏览器地址栏输入http://learn.me/sql/article.php?id=-1 OR 1=1,就构成了一个SQL注入攻击。因为id=-1永远为假,而1=1永远为真,整个WHERE子句永远为真,相当于没有加条件,因此查询结果可能返回整张表的内容。

案例二:字符串型注入(用户登录场景)

  • 场景:用户登录界面包括用户名和密码输入框,以及提交按钮。登录时调用接口,如http://learn.me/sql/login.html,后台对POST请求参数中的用户名、密码进行参数校验,即进行SQL查询。

  • 攻击方式

    • 假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码提交,会调用SQL语句SELECT * FROM user WHERE username = ‘user’ AND password = ‘pwd123’
    • 使用SQL注释符号注释掉密码检查的方式,在无需知道密码的情况下登录任意用户。比如提交用户名admin'-- (注意--后面有个空格,单引号闭合admin左边的单引号),密码置空,后台SQL查询语句将会是SELECT * FROM users WHERE username = 'admin'--' AND password = ''。该查询将会返回用户admin的详细信息,从而登录成功。

案例三:获取隐藏数据(购物网站商品分类场景)

  • 场景:一个购物网站展示不同类别的商品,当用户点击礼品分类时,浏览器请求的网址类似于https://www.example.com/products?category=Gifts,该请求会构造SQL查询语句来获取礼品的详细信息,如SELECT * FROM products WHERE category = 'Gifts' AND released = 1。其中,released = 1用来限制没有发布的商品。
  • 攻击方式:攻击者可以构造如下攻击请求https://www.example.com/products?category=Gifts'--,结果SQL查询会变成SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1。这里的双横杠--是注释符号,它之后的内容会被视为注释,从而删除了查询的其余部分,不再包含AND released =1,意味着所有的商品都将被展示出来,包括未发布的。

案例四:公安局户籍中心信息泄露

  • 场景:公安局户籍中心使用的是MySQL数据库,查询某个公民详细信息的SQL语句是Select * from t_Citizen where id='$id' and pwd='$pwd'(假设$id$pwd是分别传递身份证号和查询密码的变量)。
  • 攻击方式:攻击者在前台界面上输入id:1234'#,密码随意输入。只要数据库中存在1234这个id的记录,就能查出该人的身份,而无需提供密码。因为MySQL中,以#开头的内容被视为注释,把输入的数据代入SQL语句得到Select * from t_Citizen where id='1234'#' and pwd='$pwd',实际有效的查询条件就变成了where id='1234'

案例五:绕过验证码下载资源

  • 场景:某网站的下载页面中,输入验证码被提交到数据库里执行的语句是Select product from t_Product where passcode='code'(“code”是接收值的变量)。
  • 攻击方式:攻击者在文本里输入1'or'1'='1,然后点击“下载”,提交的查询就变成了Select product from t_Product where passcode='1'or'1'='1'。原先的一个字符串变成了3个,而且用“或”关系连了起来,形成了一个永远成立的条件,从而绕过验证直接下载资源。

这些案例展示了SQL注入攻击在不同场景下的应用方式和危害。为了防止SQL注入攻击,需要对用户输入的数据进行严格的验证和过滤,使用参数化查询或预编译语句,并为数据库用户分配最小必要的权限。

相关文章:

mysql学习教程,从入门到精通,SQL 注入(42)

1、 SQL 注入 SQL 注入是一种严重的安全漏洞,它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害,我不能提供具体的恶意代码示例。然而,我可以向你展示如何防御 SQL 注入,并解释其工作原理…...

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

图论day60|108.冗余连接(卡码网)、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】 108.冗余连接(卡码网)109.冗余连接II(卡码网)【并查集 摧毁…...

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域,MetaTrader是一款备受欢迎的交易软件,包括MT5和MT4,提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言,编写专家顾问(EA)可能显得既复杂又令人望而却步。幸运的是&…...

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka,本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业(Load job) 导入作业会常驻运行,当导入作业的状态为 R…...

从零开始学PHP之输出语句变量常量

一、 输出方式 在 PHP 中输出方式: echo,print,print_r,var_dump 1、echo和print为php的输出语句 2、var_dump,print_r为php的输出函数 (这里不做介绍)echo 和 print 区别 1、echo - 可以输出…...

二叉树算法之字典树(Trie)详细解读

字典树(Trie,也称前缀树或单词查找树)是一种用于快速查找字符串的数据结构,主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合,比如单词自动补全、拼写检查等场景。 1. 字典树的…...

butterfly侧边栏音乐模块

方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹&#xff08;如果没有_data文件夹&#xff09; 2.在刚刚的_data文件夹里创建widget.yml文件 bottom:- class_name: user-musicid_name: user-musicname: 音乐icon: fas fa-heartbeatorder:html: <…...

【论文阅读】Detach and unite: A simple meta-transfer for few-shot learning

分离与联合&#xff1a;一种用于小样本学习的简单元迁移方法 引用&#xff1a;Zheng Y, Zhang X, Tian Z, et al. Detach and unite: A simple meta-transfer for few-shot learning[J]. Knowledge-Based Systems, 2023, 277: 110798. 论文地址&#xff1a;下载地址 论文代码&a…...

Java中的动态代理——介绍与使用示例

Java中的动态代理其实就是一种“代理”模式&#xff0c;在运行时帮我们创建一个“代理对象”&#xff0c;通过这个代理对象可以在不改变原本方法的情况下&#xff0c;做一些额外的事情&#xff0c;比如记录日志、检查权限等。这种代理机制非常灵活和实用&#xff0c;特别是在像…...

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频&#xff1a; P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…...

Python | Leetcode Python题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution:def constructRectangle(self, area: int) -> List[int]:w int(sqrt(area))while area % w:w - 1return [area // w, w]...

新版vs code + Vue高亮、语法自动补全插件

vs code 版本或及以上 安装以下三个插件插件 Vetur Vue语法支持。包括语法高亮、语法代码提示、语法lint检测 ESLint语法纠错 Prettier 2.左下角设置 3.进行配置 配置内容&#xff1a; {"editor.fontSize": 20,"window.zoomLevel": 1,"workben…...

【优选算法】(第四十五篇)

目录 地图分析&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 课程表&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 地图分析&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#…...

自闭症儿童的康复与培养:揭秘有效方法

在生命的广阔画卷中&#xff0c;每一个孩子都是独一无二的色彩&#xff0c;他们带着各自的使命和梦想&#xff0c;踏上人生的旅程。然而&#xff0c;对于自闭症儿童而言&#xff0c;这段旅程似乎更加崎岖和艰难。幸运的是&#xff0c;星贝育园康复中心如同一盏明灯&#xff0c;…...

rom定制系列------小米8澎湃os1.0.28安卓13客户定制固件 刷写以及界面预览

&#x1f49d;&#x1f49d;&#x1f49d; 小米8后置指纹版&#xff0c;机型代码dipper&#xff0c; 官方最终版为12.5.2安卓10的版本。对于一些工作室不太适用。客户需要应用在安卓13的固件。根据客户提供的固件将卡刷改为线刷。并且修改其中客户需求。去除不需要的内置应用以…...

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…...

Chrome谷歌浏览器禁止空格下翻页但可以暂停和播放视频脚本js

前提 播放某些网站的视频的时候(不能网页全屏的视频) 会产生空格下翻页但是不能暂停播放视频&#xff0c;解决方案:下载油猴或者脚本猫把这代码填进去 (function() {use strict;document.body.onkeydown function(event) {var e window.event || event;// 检查是否按下空格…...

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

&#xff08;一&#xff09;启动 创建环境python3.9 打开此环境终端 &#xff08;后面的语句操作几乎都在这个终端执行&#xff09; 输入up主提供的语句&#xff1a;pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址&#xff1a; Start Locally | P…...

H-TCP 的效率和公平性

昨晚带安孩楼下玩耍&#xff0c;用手机 desmos 作了一组 response curve 置于双对数坐标系&#xff1a; 长肥管道的优化思路都很类似&#xff0c;cwnd 增长快一点&#xff1a; BIC TCP&#xff1a;二分查找逼近 capacity&#xff1b;CUBIC TCP&#xff1a;上凸曲线逼近 capa…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...