SQL注入攻击和防御

声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。

# 概述

SQL注入是一种网络安全攻击,它利用了Web应用程序对用户输入的验证不足,从而在后台数据库中执行恶意的SQL语句,获取或修改数据,甚至控制数据库服务器。

# SQL注入产生的原因

Web应用程序使用了动态SQL语句,即根据用户输入的内容拼接SQL语句,而没有对用户输入的内容进行合法性检查或过滤。

例如,以下是一个PHP代码片段,用于根据用户输入的用户名和密码进行登录验证:

$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);

这段代码直接使用了用户输入的用户名和密码,拼接成了一个SQL查询语句,然后执行该语句。如果用户输入的用户名和密码都是合法的,例如username = 'admin'password = '123456',那么SQL语句就是:

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

这个语句的作用是从users表中查询用户名和密码都匹配的记录,如果存在,就表示登录成功,否则,就表示登录失败。

但是,如果用户输入的用户名或密码包含了一些特殊的字符或命令,例如username = 'admin'password = '123456' OR 1 = 1,那么SQL语句就变成了:

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

这个语句的作用是从users表中查询用户名和密码都匹配,或者1等于1的记录,由于1等于1永远为真,所以这个语句会返回users表中的所有记录,相当于绕过了密码验证,实现了SQL注入攻击。(万能密码就是这个原理)

例2,假设你想在某个网站上购买一本书,你需要输入你的姓名、地址、信用卡号等信息,然后点击提交按钮,完成订单。这个网站的后台程序可能会使用类似于以下的SQL语句,将你的信息插入到数据库中:

INSERT INTO orders (name, address, credit_card) VALUES ('$name', '$address', '$credit_card')

其中,$name$address$credit_card是你输入的内容,用单引号包围。如果你输入的内容都是合法的,例如name = '张三'address = '重庆市南岸区YJ'credit_card = '1234-5678-9012-3456',那么SQL语句就是:

INSERT INTO orders (name, address, credit_card) VALUES ('张三', '重庆市南岸区YJ', '1234-5678-9012-3456')

这个语句的作用是将你的信息插入到orders表中,没有任何问题。

但是,如果你输入的内容包含了一些特殊的字符或命令,例如name = '张三'address = '重庆市南岸区YJ'credit_card = '1234-5678-9012-3456'; DROP TABLE orders; --',那么SQL语句就变成了:

INSERT INTO orders (name, address, credit_card) VALUES ('张三', '重庆市南岸区YJ', '1234-5678-9012-3456'; DROP TABLE orders; --')

这个语句的作用是先将你的信息插入到orders表中,然后执行一个分号后面的命令,即删除orders表,最后执行一个双破折号后面的注释,即忽略后面的内容。这样,你就利用了SQL注入攻击,删除了网站的订单数据,造成了严重的损失。

# SQL注入防御
  • 使用参数化查询或预编译语句

    即将用户输入的内容作为参数传递给SQL语句,而不是直接拼接。参数化查询或预编译语句可以有效地防止SQL注入攻击,因为它们会将用户输入的内容作为字面值,而不是可执行的代码。

    例如,以下是一个使用参数化查询的PHP代码片段,用于根据用户输入的用户名和密码进行登录验证:

    $username = $_POST['username'];
    $password = $_POST['password'];
    $sql = "SELECT * FROM users WHERE username = ? AND password = ?";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "ss", $username, $password);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    

    这段代码使用了mysqli_prepare函数来预编译SQL语句,使用了?占位符来表示参数,使用了mysqli_stmt_bind_param函数来绑定参数的值和类型,使用了mysqli_stmt_execute函数来执行SQL语句。这样,即使用户输入的用户名或密码包含了特殊的字符或命令,也不会影响SQL语句的结构和语义,而只会作为普通的字符串进行比较,从而避免了SQL注入攻击。

    • 使用最小权限原则

      如果给数据库用户分配了过多的权限,导致攻击者可以利用SQL注入攻击执行一些危险的操作,例如删除表、修改数据、执行系统命令等。例如,如果Web应用程序使用的数据库用户拥有db_owner角色,那么攻击者就可以利用SQL注入攻击执行以下语句,删除users表:

      DROP TABLE users
      

      或者执行以下语句,调用xp_cmdshell扩展存储过程,执行系统命令,例如打开计算器:

      EXEC xp_cmdshell 'calc.exe'
      

      因此,为了防止SQL注入攻击,Web应用程序应该使用最小权限原则,即只给数据库用户分配必要的权限,例如只允许执行查询和更新操作,而不允许执行删除和执行操作。

      你可以使用MySQL的GRANT命令,指定用户的用户名、主机名、数据库名、表名和权限。例如,假设你的webapp用户的用户名是webapp,主机名是localhost,数据库名是mydb,表名是mytable,你可以使用以下命令:

      GRANT SELECT, UPDATE ON mydb.mytable TO 'webapp'@'localhost';
      

      这个命令的作用是给webapp用户授予在mydb数据库的mytable表上执行SELECT和UPDATE操作的权限。如果你想要授予webapp用户在mydb数据库的所有表上执行查询和更新操作的权限,你可以使用以下命令:

      GRANT SELECT, UPDATE ON mydb.* TO 'webapp'@'localhost';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806147.shtml

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

相关文章

用vue3写一个AI聊天室

效果图如下&#xff1a; 1、页面布局&#xff1a; <template><div class"body" style"background-color: rgb(244, 245, 248); height: 730px"><div class"container"><div class"right"><div class"…

如何用electron(vue)搜索电脑本地wifi

对于搜索本地 WiFi 网络&#xff0c;可以使用 Electron 结合 Node.js 来编写一个简单的应用程序。 以下是一个基本的示例&#xff0c;它使用 Node.js 的 wifi 模块来搜索并列出附近的 WiFi 网络&#xff1a; 首先&#xff0c;确保你已经安装了 Node.js 和 Electron。 然后&am…

数据结构——线性表(链式存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

利用python构建Dockerfile 文件

使用 Python 脚本来创建 Dockerfile 可以带来多方面的好处&#xff0c;尤其是当你需要自动化构建过程、管理复杂的构建步骤或者需要根据不同的环境条件生成不同的 Docker 镜像时。以下是使用 Python 创建 Dockerfile 的一些主要优点&#xff1a; 自动化和可重复性&#xff1a; …

蓝桥杯刷题 二分-[2145]求阶乘(C++)

问题描述 满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少? 如果这样的 N 不存在输出 −1。 输入格式 一个整数 K。 输出格式 一个整数代表答案。 样例输入 2 样例输出 10 评测用例规模与约定 对于 30% 的数据&#xff0c;1 ≤ K ≤ 10的6次方 对于 100% 的数据&…

【MATLAB 分类算法教程】_2粒子群算法优化支持向量机SVM分类 - 教程和对应MATLAB代码

分类代码案例2:粒子群算法优化支持向量机SVM分类 - MATLAB完全代码教程 1. 初始化代码2. 读取数据代码3.数据预处理代码4.利用粒子群算法PSO求解最佳的SVM参数c和g代码5.根据最佳的参数进行SVM模型训练代码6.SVM模型预测代码7.准确率分析以及分类结果对比作图代码本文以红酒数…

结合 tensorflow.js 、opencv.js 与 Ant Design 创建美观且高性能的人脸动捕组件并发布到InsCode

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…

lisp学习历程

学习Lisp是一项有趣且具有挑战性的过程&#xff0c;它是一种古老的编程语言&#xff0c;但在人工智能和函数式编程领域仍然有很高的影响力。下面是一个可能的Lisp学习历程&#xff1a; 了解Lisp的历史和基本概念&#xff1a; 了解Lisp的起源、发展历程和影响。理解Lisp的基本概…

uniapp:聊天消息列表(好友列表+私人单聊)支持App、H5、小程序

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 文章简介&#xff08;效果图展示&#xff…

2024-04-10 Linux gzip 和 gunzip 命令,gzip 压缩的文件通常比原始文件小得多。

一、gzip 是 Linux 系统中用于压缩文件的命令&#xff0c;它通常用于将单个文件压缩成 .gz 格式的文件。gzip 压缩的文件通常比原始文件小得多&#xff0c;因此它在节省磁盘空间和减少文件传输时间方面非常有用。 gzip 命令的基本语法如下&#xff1a; gzip [选项] [文件]复制…

asp.net dropdownlist二级联动

asp.net dropdownlist二级联动 asp.net dropdownllist绑定数据库 怎么根据dropdownlist1选择的二级联动dropdownlist2 AutoPostBack"True"后 重新获取的dropdownlist1 为空了 在 ASP.NET 中使用 DropDownList 绑定数据库的步骤如下&#xff1a;创建一个 DropDownL…

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…

ssm038汽车养护管理系统+jsp

汽车养护管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本汽车养护管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

保姆级教程带你实现HarmonyOS手语猜一猜元服务(二)

由于文章篇幅较长&#xff0c;共分为了三篇发布&#xff1a; 保姆级教程带你实现HarmonyOS手语猜一猜元服务&#xff08;一&#xff09; 保姆级教程带你实现HarmonyOS手语猜一猜元服务&#xff08;二&#xff09; 保姆级教程带你实现HarmonyOS手语猜一猜元服务&#xff08;三&…

微信小程序页面交互综合练习 (重点:解决“setData of undefined”报错问题)

一、写一个注册表单&#xff0c;点击“注册”按钮将用户输入的数据带到服务器&#xff0c;并且能在控制台显示参数。 &#xff08;1&#xff09;首先&#xff0c;我需要在vscode里面创建一个简易的node.js服务器 //第一步:引入http模块 var http require(http); //第二步:创建…

自动驾驶定位算法-粒子滤波(Particle Filter)

自动驾驶定位算法-粒子滤波(Particle Filter) 自动驾驶对定位的精度的要求在厘米级的&#xff0c;如何实现厘米级的高精度定位呢&#xff1f;一种众所周知的定位方法是利用全球定位系统(GPS)&#xff0c;利用多颗卫星的测量结果&#xff0c;通过三角测量(Triangulation)机制确…

spring-cloud微服务openfeign

Spring Cloud openfeign对Feign进行了增强&#xff0c;使其支持Spring MVC注解&#xff0c;另外还整合了Ribbon和Nacos&#xff0c;从而使得Feign的使用更加方便 优势&#xff0c;openfeign可以做到使用HTTP请求远程服务时就像洞用本地方法一样的体验&#xff0c;开发者完全感…

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

M1 Flutter SDK的安装和环境配置

前言 作为iOS 开发&#xff0c;观望了许久的Flutter &#xff0c;还是对它下手了&#xff0c;不是故意要卷&#xff0c;没办法工作需要&#xff01;既然要学Flutter&#xff0c;首先就得配置Flutter的相关环境&#xff0c;由于我的是M1 芯片的电脑&#xff0c;记录下来配置过程…

spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼

flyway 是一个敏捷工具&#xff0c;用于数据库的移植。采用 Java 开发&#xff0c;支持所有兼容 JDBC 的数据库。 主要用于在你的应用版本不断升级的同时&#xff0c;升级你的数据库结构和里面的数据。 还是直接上代码 第一步&#xff1a; <!-- Flyway 数据库迁移 依赖 他…