当前位置: 首页 > 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…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...