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

MYSQL--------SQL 注入简介MySQL SQL Mode 简介

SQL 注入简介

  • 定义:SQL 注入是一种常见的安全漏洞,攻击者通过在输入中插入恶意的 SQL 语句,利用应用程序中未正确处理的输入数据,来改变 SQL 查询的逻辑,从而执行非预期的操作,如绕过身份验证、获取未授权数据、修改或删除数据等。
  • 示例
-- 正常的登录查询
SELECT * FROM users WHERE username = 'admin' AND password = 'password';-- 恶意的 SQL 注入
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';

代码解释

  • 在上述恶意注入示例中,攻击者将密码输入修改为 '' OR '1'='1',使查询的 WHERE 条件恒为真,从而绕过密码验证。

应用开发中可以采取的措施

prepareStatement + Bind-Variable
  • 在 Java 等编程语言中使用 prepareStatement 和绑定变量可以防止 SQL 注入。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.DriverManager;public class SecureSQL {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database";String user = "your_username";String password = "your_password";String usernameInput = "admin";String passwordInput = "malicious' OR '1'='1"; // 模拟恶意输入try (Connection conn = DriverManager.getConnection(url, user, password)) {String sql = "SELECT * FROM users WHERE username =? AND password =?";try (PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, usernameInput);pstmt.setString(2, passwordInput);try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {System.out.println(rs.getString("username"));}}}} catch (SQLException e) {e.printStackTrace();}}
}

代码解释

  • PreparedStatement 会预编译 SQL 语句,将 SQL 语句和参数分开处理。
  • pstmt.setString(1, usernameInput);pstmt.setString(2, passwordInput); 会将输入参数作为数据而不是 SQL 代码处理,避免输入被当作 SQL 语句的一部分执行,从而防止 SQL 注入。
使用应用程序提供转换函数
  • 许多编程语言和框架提供了转换函数,可以对用户输入进行转义处理,将特殊字符转义为安全的形式。
  • 例如,在 PHP 中:
<?php
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);
?>

代码解释

  • mysqli_real_escape_string 函数将特殊字符转义,使它们在 SQL 查询中被视为普通字符,而不是 SQL 代码的一部分。
自己定义函数进行校验
  • 可以自定义函数对输入进行检查和过滤,去除或替换可能导致 SQL 注入的字符。
import re
import mysql.connectordef sanitize_input(input_str):# 去除特殊字符sanitized = re.sub(r"[;'\"]", "", input_str)return sanitizedusername = sanitize_input(input("Enter username: "))
password = sanitize_input(input("Enter password: "))try:conn = mysql.connector.connect(host="localhost",user="your_username",password="your_password",database="your_database")cursor = conn.cursor()sql = "SELECT * FROM users WHERE username = %s AND password = %s"cursor.execute(sql, (username, password))result = cursor.fetchall()for row in result:print(row)cursor.close()conn.close()
except mysql.connector.Error as err:print(f"Error: {err}")

代码解释

  • sanitize_input 函数使用正则表达式将 ;, ', " 等特殊字符去除,减少 SQL 注入的风险。

小结

  • SQL 注入的危害
    • SQL 注入是一种严重的安全威胁,可能导致数据泄露、数据篡改、系统瘫痪等严重后果。
  • 防范措施
    • 使用 prepareStatement 和绑定变量是最推荐的方法,因为它将 SQL 语句和输入数据分离,确保输入只作为数据而不是 SQL 代码处理。
    • 转换函数也能起到一定的防护作用,但可能存在局限性,对于复杂的注入方式可能无法完全防止。
    • 自定义函数可以根据具体需求对输入进行定制化的校验和过滤,但需要确保其逻辑的完整性和有效性。

在开发应用程序时,安全应该是首要考虑的因素之一,尤其是处理用户输入时,务必采取有效的防范措施防止 SQL
注入,以确保数据库的安全性和数据的完整性。根据不同的开发语言和框架,选择合适的防范手段,并结合多种方法提高安全性。同时,定期进行安全审计和代码审查,确保防范措施的有效性。

在这里插入图片描述

MySQL SQL Mode 简介

  • 定义:SQL Mode 是 MySQL 中的一组设置,它定义了 MySQL 服务器应该支持的 SQL 语法和数据验证规则。通过改变 SQL Mode,可以控制服务器的行为,使其遵循不同的 SQL 标准或进行更严格的数据检查。
  • 作用
    • 可以让 MySQL 服务器遵循不同的 SQL 标准,如 ANSI、TRADITIONAL 等。
    • 对数据进行严格的数据类型和数据完整性检查,避免插入不符合预期的数据。

常用的 SQL Mode

  • ANSI

    • 使 MySQL 的行为更接近 ANSI SQL 标准,比如使用双引号 " 作为标识符引用,而不是默认的反引号 ```。
    • 示例:
    SET sql_mode = 'ANSI';
    
    • 该模式会影响一些函数的行为,如 VARCHAR 列的处理方式和日期格式等。
  • STRICT_TRANS_TABLES

    • 对事务表进行严格的检查,当插入或更新数据时,如果出现数据截断或超出范围等情况,会产生错误而不是警告。
    • 示例:
    SET sql_mode = 'STRICT_TRANS_TABLES';
    
    • 对于 INSERTUPDATE 操作,如果插入的值超出列的数据类型范围,会导致操作失败,防止数据的意外截断或错误存储。
  • TRADITIONAL

    • 结合了 STRICT_TRANS_TABLESSTRICT_ALL_TABLES 和其他一些严格的模式,提供更严格的数据验证。
    • 示例:
    SET sql_mode = 'TRADITIONAL';
    
    • 在这种模式下,MySQL 会对数据的完整性和一致性进行严格检查,对于不满足要求的数据会报错。

SQL Mode 在迁移中如何使用

  • 数据迁移时的一致性检查

    • 在将数据从一个数据库迁移到另一个数据库时,可以将目标 MySQL 服务器的 SQL Mode 设置为更严格的模式,以确保数据的完整性和一致性。
    • 例如,从一个较宽松的环境迁移到一个更严格的生产环境时,设置 TRADITIONAL 模式可以在迁移过程中发现并解决潜在的数据问题。
    SET sql_mode = 'TRADITIONAL';
    -- 执行数据迁移操作
    
    • 在迁移前,可以先将 SQL Mode 设置为严格模式,然后执行迁移操作,如使用 INSERTLOAD DATA 语句导入数据,此时不符合严格规则的数据会报错,而不是被静默处理,方便排查和修复问题。
  • 确保兼容性

    • 当从其他数据库系统迁移数据到 MySQL 时,可以将 MySQL 的 SQL Mode 设置为更符合源数据库系统的模式,以确保兼容性。
    • 例如,从 PostgreSQL 迁移数据到 MySQL,可以先设置 ANSI 模式,使 MySQL 的行为更接近 PostgreSQL,减少迁移过程中的兼容性问题。
    SET sql_mode = 'ANSI';
    -- 执行数据迁移操作
    

小结

  • SQL Mode 的重要性
    • SQL Mode 是 MySQL 中一个重要的配置,它可以控制 MySQL 服务器的行为,确保数据的一致性和完整性,同时可以使 MySQL 更好地遵循不同的 SQL 标准。
  • 常用模式的选择
    • ANSI 模式使 MySQL 遵循 ANSI SQL 标准,适用于需要与其他数据库系统兼容的情况。
    • STRICT_TRANS_TABLES 模式对事务表进行严格检查,防止数据截断和超出范围的错误。
    • TRADITIONAL 模式提供最严格的数据验证,适合对数据质量要求较高的场景。
  • 迁移中的使用
    • 在数据迁移过程中,根据迁移的源和目标环境,合理设置 SQL Mode 可以帮助发现和解决数据问题,确保迁移的顺利进行。

在使用 SQL Mode 时,要根据实际需求和场景选择合适的模式,并且可以在不同的阶段灵活调整 SQL
Mode,以达到最佳的数据处理和存储效果。同时,在设置 SQL Mode 时,要注意其对已有应用程序和 SQL
操作的影响,避免因模式的改变而导致意外的错误或不兼容问题。在开发和维护数据库系统时,要充分考虑 SQL Mode
作为一种灵活的工具,以满足不同的数据管理和兼容性需求。

相关文章:

MYSQL--------SQL 注入简介MySQL SQL Mode 简介

SQL 注入简介 定义&#xff1a;SQL 注入是一种常见的安全漏洞&#xff0c;攻击者通过在输入中插入恶意的 SQL 语句&#xff0c;利用应用程序中未正确处理的输入数据&#xff0c;来改变 SQL 查询的逻辑&#xff0c;从而执行非预期的操作&#xff0c;如绕过身份验证、获取未授权…...

第6章——HTTP首部

第六章——HTTP首部 HTTP报文结构 ​ 都必有报文首部 HTTP请求报文 HTTP响应报文 HTTP首部字段 ###传递重要信息 首部字段结构 ​ 首部字段名&#xff1a;字段值&#xff08;&#xff0c;字段值&#xff0c;字段值&#xff09; 首部字段类型 ​ 通用首部字段 请求首部字…...

多行输入模式(dquote> 提示符)double quote(双引号)

文章目录 1、引号不匹配具体原因解决办法如何避免此问题 2、double quote&#xff08;双引号&#xff09;出现原因解决办法预防措施 ~/Downloads/productqualification-develop git:[main] git commit -m "漏添加到暂存区的代码“ dgqdgqdeMac-mini productqualification-…...

【什么是MVCC?】

MVCC&#xff08;Multi - Version Concurrency Control&#xff09;即多版本并发控制。 一、背景和概念 在数据库系统中&#xff0c;并发控制是非常重要的。当多个事务同时访问和修改数据时&#xff0c;需要一种机制来确保数据的一致性和正确性。MVCC 是一种并发控制的技术&a…...

HarmonyOS开发:粒子动画应用实战

目录 引言 粒子动画技术概述 关于粒子动画 粒子发射器的实现 设置粒子颜色 关于粒子的生命周期 粒子扰动场的设置 粒子动画的简单实现 最后 引言 做应用开发的小伙伴想必都清楚动画是必备技能&#xff0c;尤其是在移动应用开发中的动画使用频率是非常高的。而粒子动画…...

数据库课设——网上花店销售管理系统(上)

声明&#xff1a;此次课设为本人专业课课设报告内容&#xff0c;仅供参考&#xff0c;不要照搬 1 问题的提出 随着互联网发展与电子商务普及&#xff0c;网上花店兴起&#xff0c;其突破地域限制、提供便捷购物体验且市场呈快速增长趋势。该系统需具备多方面功能以满足花店运营…...

用于AI的 数据存储其获取介绍

用于 AI 的数据存储和获取方法依赖于系统架构、数据类型&#xff08;结构化、非结构化、时序数据、嵌入向量等&#xff09;以及使用场景&#xff08;训练数据存储、实时推断、历史数据分析等&#xff09;。以下是主要存储方式的分类和简介&#xff1a; 1. 文件存储 介绍&…...

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年&#xff0c;这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合&#xff0c;大大提高了研发效率。在开发过程中&#xff0c;也遇到了一些性能相关问题和…...

L28.【LeetCode笔记】移动零(三种解法)

目录 1.题目 2.向前覆盖法 分析 代码 提交结果 3.优解:双指针 代码 提交结果 4.其他不符合题意的方法:使用队列 代码 提交结果 1.题目 https://leetcode.cn/problems/move-zeroes/description/ 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾…...

jenkins入门10--自动化构建

build periodically&#xff1a;设定类似cron周期性时间触发构建 * * * * * (五颗星&#xff0c;中间用空格隔开&#xff09; 第一颗表示分钟&#xff0c;取值0~59 第二颗表示小时&#xff0c;取值0~23 第三颗表示一个月的第几天&#xff0c;取值1~31 第四颗表示第几月&#xf…...

el-table拖拽表格

1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js&#xff0c;我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强&#xff0c;实现组件化的思想&#xff0c;可以结合Vue&#xff0c;使用起来更方便。 2、引入拖拽函数…...

如何轻松反转C# List<T>中的元素顺序

在C#中&#xff0c;有多种方法可以反转 List<T> 的元素顺序。以下是几种常见的方法&#xff1a; 方法一&#xff1a;使用 List<T>.Reverse 方法 List<T> 类提供了一个内置的 Reverse 方法&#xff0c;可以就地反转列表中的元素顺序。 using System; using…...

Transformer中Self-Attention以及Multi-Head Attention模块详解(附pytorch实现)

写在前面 最近在项目中需要使用Transformer模型来处理图像任务&#xff0c;所以稍微补充一下这部分的知识&#xff0c;本篇主要了解一下Self-Attention以及Multi-Head Attention模块。 原论文链接&#xff1a;https://arxiv.org/pdf/1706.03762 原文代码&#xff1a;tensor2…...

在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b

目录 背景&#xff1a;步骤 1.获取模型权重第 2 步&#xff1a;准备第 3 步&#xff1a;构建 TensorRT-LLM 引擎 背景&#xff1a; 大型语言模型 &#xff08;LLM&#xff09; 推理的关键瓶颈在于 GPU 内存资源短缺。因此&#xff0c;各种加速框架主要强调减少峰值 GPU 内存使…...

六十一:HTTP/2的问题及HTTP/3的意义

随着互联网的快速发展&#xff0c;网络协议的升级成为优化用户体验和提升网络效率的重要手段。HTTP/2 于 2015 年发布&#xff0c;标志着超文本传输协议的重大改进。然而&#xff0c;尽管 HTTP/2 带来了许多新特性&#xff0c;它也存在一定的问题。在此背景下&#xff0c;HTTP/…...

IOS开发如何从入门进阶到高级

针对iOS开发的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作&#xff0c;汇集了大量开…...

非一般的小数:小数的概念新解、小数分类、浮点数的存储

非一般的小数&#xff1a;小数的概念新解、小数分类、浮点数的存储 一、小数的概念二、小数的分类1&#xff0e;有限小数、无限循环小数、无限不循环小数2&#xff0e;纯小数、带小数3&#xff0e;定点数、浮点数 三、浮点数的存储 一、小数的概念 这还用解释吗&#xff1f;小…...

关于游戏销量的思考

1、黑神话达到2300万套&#xff0c;分析师上调预期到超过100亿营收。 以往的我的世界、小鸟、超级食肉男孩等游戏也都是几千万&#xff0c;上亿的销量。 也改变了相关开发者的命运。 一个开发者&#xff0c;卖出一个30万&#xff0c;或100万销量的作品&#xff0c;就足够改变…...

JuiceFS 详解:一款为云原生设计的高性能分布式文件系统

JuiceFS 详解&#xff1a;一款为云原生设计的高性能分布式文件系统 1. 什么是 JuiceFS&#xff1f; JuiceFS&#xff08;Juiced File System&#xff09;是一款高性能、POSIX 兼容的云原生分布式文件系统。它采用对象存储作为底层存储&#xff0c;支持多种元数据引擎&#xf…...

百度Android面试题及参考答案 (下)

Executorservice 和 Executor 有什么区别? Executor 接口 Executor 是一个简单的接口,它定义了一个方法execute(Runnable command)。这个接口的主要目的是将任务的提交和任务的执行分离,它提供了一种通用的方式来执行一个Runnable任务,但是它没有提供更多高级的功能,比如任…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...