MySQL(十二)------ SQL中的安全问题

MySQl登录实例的SQL的注入问题 SQL注入问题想必大家都会有所听闻,因为也许大家都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。... 阅读详情

       日常开发过程中我们通常只关心SQL语句能否实现预期功能,往往忽略了SQL语句可能会带来的系统漏洞,常遇到的就是SQL注入。

一、SQL注入简介

       这里不做抽象的解释,可能说完也不会明白,直接用例子来演示SQL注入:

1. 首先我们创建一张表并插入一条数据来模拟实际情况下接触不到的数据库

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(64) NOT NULL,
  password varchar(64) NOT NULL,
  email varchar(64) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY username (username)
  );

INSERT INTO users (username,password,email)
  VALUES('test',md5('admin'),'test@admin.com');

2. 登陆界面,提交了用户名和密码后,表单会将数据提交给后台进行验证

<html>
<head>
<title>Sql注入演示</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body >
<form action="validate.php" method="post">
  <fieldset >
    <legend>Sql注入演示</legend>
    <table>
      <tr>
        <td>用户名:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr>
        <td>密&nbsp;&nbsp;码:</td>
        <td><input type="text" name="password"></td>
      </tr>
      <tr>
        <td><input type="submit" value="提交"></td>
        <td><input type="reset" value="重置"></td>
      </tr>
    </table>
  </fieldset>
</form>
</body>
</html>

3.验证模块(PHP语言)

<?php
       $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");;
       mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");
       $name=$_POST['username'];
       $pwd=$_POST['password'];
       $sql="select * from users where username='$name' and password='$pwd'";
       $query=mysql_query($sql);
       $arr=mysql_fetch_array($query);
       if(is_array($arr)){
              header("Location:manager.php");
       }else{
              echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";
       }
?>

          代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。

         注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,这就是SQL注入的基础,待会就能看出这样做的风险有多大。

4. 注入演示

       当我们在验证界面填写正确的用户名 test 和密码 admin 时,会成功登陆,它执行的SQL语句为:select * from users where username='test' and password=md5('admin') ,显然这条记录在数据库中存在,因此能成功登陆。

       当我们在用户名输入框那输入 ’  or 1=1 # ,密码随便输,此时在验证过程中的SQL语句就是:select * from users where username='' or 1=1 # and password=md5('') ,由于#、/*在SQL语句中是注释语句的开头标识,因此,后面的都被注释掉了,从而上面的SQL语句相当于 select * from users where username='' or 1=1,此时我们发现1=1恒成立,而且使用的是or连接,故而这条语句又等价于 select * from users ,显然,不管什么情况下该语句都能成功执行,也就是说我这样输入用户名不用管密码都可以成功登陆,这明显是不对的。

       这就大概说明了SQL是怎样进行注入的,你可能觉得不就是多一个登陆嘛,没什么危害,那你可能是还没有看到它的厉害之处。既然我能假登陆,那我也可以通过这样构造SQL来获取你的数据库信息,得到超级管理权权限,进而对你的数据随意更改,这下你知道它的厉害了吧。更详细说明参见https://www.2cto.com/article/201310/250877.html博客。

二、防范措施

2.1 PrepareStatement + Bind-Variable

       这种方法只能针对Java、JSP开发的应用。因为PrepareStatement语句是由JDBC驱动来支持的,它仅仅是做了一些替换和转义,MySQL本身只是绑定了变量。

       避免SQL注入的原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析准备,因此也就避免了sql注入问题。

       比如上面用户名传的变量是 ” ’ or 1=1 # “,企图利用构造SQL语句来蒙混过关,但由于使用了PreparedStatement绑定变量,里面的引号被转义,#号被绑定到字符串上,从而它只能作为参数传递给已经预编译好的SQL语句,从而它无法和SQL语句组合后再编译执行,这样就避免了注入攻击。

       使用好处:

       (1).代码的可读性和可维护性好;

       (2).PreparedStatement尽最大可能提高性能;

       (3).最重要的一点是极大地提高了安全性;

        所以一般能使用这种方法就推荐使用这种方式防范SQL注入。

2.2  使用应用程序提供的转换函数

       很多应用程序接口都提供了对特殊字符进行转换的函数,利用他们可以对用户的输入进行转换,防止生成不被期望的语句。

  • MySQL C API:使用mysql_real_escape_string() API调用;
  • MySQL++:使用escape和quote修饰符;
  • PHP:4.3版本之前使用mysql_real_escape_string()函数,PHP5开始使用扩展的MySQLI;
  • Perl DBI:使用placeholders或者quote()方法;
  • Ruby DBI:使用placeholders或者quote()方法;

2.3 自定义函数进行校验

       可以使用自定义的函数对输入进行校验,输入验证的途径可分为以下几种:

  • 整理数据使之变得有效;
  • 拒绝已知的非法输入;
  • 只接受已知的合法输入;

      比如可以通过正则表达式来过滤掉非法字符,这样攻击者就无法通过字符的组合来注入SQL,从而防范攻击。可以将非法字符列出,如果有新增的就加入到这里面,还要注意字符的变形,比如它的16进制表示形式等。

浅析MySQL安全问题:SQL注入攻击 SQL 注入简介 、应用开发中可以采取的应对措施 、PrepareStatement+Bind-variable 、使用应用程序提供的转换函数 、自己定义函数进行校验 阅读详情

相关推荐

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

MySQL数据库管理 (1) 如何在Linux服务器上实现MySQL数据库用户管理授权

MySQL数据库用户管理授权1.数据库用户管理授权1.0.1 设置用户权限1.0.2 查看用户的权限1.0.3 撤销用户的权限 1.数据库用户管理授权 1.0.1 设置用户权限 DCL语句设置用户权限(用户不存在时,则新建用户) GRANT 权限列表 ON数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY ‘密码’ ] 1.0.2 查看用户的权限 SHOW GRANTS FOR 用户名@来源地址 1.0.3 撤销用户的权限 REVOKE 权限列表 ON 数据库名.表名

weixin_48191060的博客 2020

【NAS系统】DSM7.2部署SVN服务

早期的群晖版本可以在套件中心找到SVN Server直接安装,然后配置仓库和用户。但‌2提到DSM7.0之后套件中心没有SVN了,得用Docker。

qq_38350004的博客 4847

如何做好SQL 数据库安全

通过本文的介绍,读者应该了解了 SQL 数据库安全的关键点,包括常见的安全威胁、安全的最佳实践、安全工具和技术,以及具体的实践案例。随着技术的不断发展,SQL 数据库安全面临的挑战也在不断变化。未来,随着新的安全技术和方法的出现,数据库安全将更加复杂和重要。企业需要持续关注安全动态,采用先进的安全措施,确保数据库的安全性和可靠性。

QQ3007250950的博客 1219

别再模拟IIC了!用STM32F103C8T6的硬件IIC驱动AT24C64,CubeMX配置+避坑指南

本文详细介绍了如何使用STM32F103C8T6的硬件IIC驱动AT24C64 EEPROM,通过CubeMX配置和HAL库函数解析,提供从模拟IIC到硬件IIC的完整解决方案。内容包括硬件IIC与模拟IIC的核心差异、CubeMX工程配置详解、HAL库驱动实战以及典型问题诊断与优化,帮助开发者构建更稳定高效的存储系统。

weixin_27038245的博客 188

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1404

你不会还不知道,网络安全必学SQL注入吧?

当找到某个变量关键词有 SQL 注入风险时,可以再根据调用链找到该存在注入风险的业务逻辑代码,查看参数来源是否安全、是否有配置SQL危险参数过滤的过滤器,最终确认是否存在SQL注入。这个简化的查询使得攻击者能够绕过原有的条件限制:这个查询会返回items表中所有储存的条目,而不管它们的所有者是谁,而原本应该只返回属于当前已认证用户的条目。修改SQL语句之后,程序停止报错,但是却引入了SQL语句拼接的问题,如果没有对用户输入的内容做过滤,势必会产生SQL注入漏洞。

2201_75362610的博客 1144

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2496

SQL安全:常见手段

前面我们从基础的单表查询一直聊到优化,讲了SQL的很多内容。这一节我们来说说怎么让我们的数据库变得更安全。为了实现常见的业务场景,数据库会提供很多的功能。有一些功能如果被攻击者利用,就很容易获取到不应该让其获取到的信息。比如拼接、比如拼接。常见的手段,可以在和进行分类。

Innocence_0的博客 1002

西电计组实验二 运算器实验

算术逻辑运算实验 一.实验目的   1.了解简单运算器的数据传输通路。   2.验证运算功能发生器的组合功能。   3.掌握算术逻辑运算加、减、与的工作原理。   4.验证实验台运算的8位加、减、与、直通功能。   5.按给定数据,完成几种指定的算术和逻辑运算。 二.实验原理   算术逻辑单元ALU的数据通路如图2-1所示。其中运算器ALU181根据74LS181的功能用VHDL硬件描述语言编辑而成,构成8位字长的ALU。参加运算的两个8位数据分别为A[7…0]和B[7…0],运算模式由S[3…0]的16种

Polaris的博客 1万+

基于YOLOv10的建筑图纸物体检测系统:从数据集构建到UI界面实现

高度结构化的图形元素标准化的符号和标注系统多层次的细节表达精确的尺寸和位置关系。

YOLO 390

sql注入的原理以及防范

前言 看到一篇不错的文章,特意学习并整理记录了下来,便于自己和广大网友查阅。 一、Sql注入简介 Sql注入攻击是通过将恶意的Sql查询或添加语句插入到应用的输入参数中,再在后台Sql服务器上解析执行进行的攻击,它目前是黑客对数据库进行攻击的最常用手段之一。 二、Web程序三层架构 三层架构(3-tier architecture)通常意义上就是将整个业务应用划分为: 界面层(User Inte...

june_young_fan的博客 1491

【ComfyUI】Wan2.2 动态服饰描述驱动换装图生视频

本文介绍了一个基于ComfyUI的Wan2.2动态服饰描述驱动换装工作流,能通过自然语言描述实现人物图像的自动换装并生成动态视频。该工作流结合多模态输入、语言模型驱动生成和视频合成技术,包含图像加载、文本解析(使用Qwen2.5大模型)、潜变量编码、视频帧采样与插值(RIFE VFI)等核心模块,最终通过VHS_VideoCombine输出流畅换装视频。整个流程无需手动干预,支持从"哥特风格"到"未来装甲"等多样化服饰风格的精确转换,通过文本节点控制50-100

Mr数据杨 2583

深入浅出MySQL SQL中的安全问题

SQL 中的安全问题 ​ 在日常开发过程中,程序员一般只关心 SQL 是否能实现预期的功能,而对于 SQL 的安全问题一般都不太重视.实际上,如果SQL语句写作不当,将会给应用系统造成很大的安全隐患,其中最重要的隐患就是 SQL 注入。本章以MySQL为例,将会对 SQL 注入以及相应的防范措施进行详细的介绍。 SQL 注入简介 ​ 结构化查询语言(SQL)是一种用来和数据库交互的文本语言。SQL 注入 (SQL Injection)就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQ

19:30的博客 716

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

mysql有哪些安全问题_MySQL--SQL中的安全问题

---恢复内容开始---1) SQL 注入简介SQL 注入(SQL Injection) 就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。他的产生主要是由程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行。2) 应用开发中可以采取的应对措施PrepareStatement + Bind-VariableMySQ...

weixin_32571761的博客 298

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL中的关键词冲突及安全问题详解

关键词冲突是指在SQL语句中使用了数据库保留的关键词作为表名、列名或其他对象名,导致SQL语句无法正确解析和执行。常见的保留关键词包括SELECTINSERTDELETEUPDATETABLE等。

m0_68358204的博客 1803

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL 8 中的 sql_mode

sql_mode

学习,分享一直在路上 2699

Mysql使用SQL的安全问题,Mysql防止SQL注入

SQL注入简述 SQL Injection攻击具有很大的危害,攻击者可以利用它读取、修改或者删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以 获得数据库管理员的权限。如果能够再利用SQLServer扩展存储过程和自定义扩展存储过程来执行一些系统命令,攻击者还可以获得该系统的控制权。而且,SQL Injection 也很难防范。网站管理员无法通过安装系统补丁或者进行简单的安全

芝麻软件工作室的专栏 2830

MySQL中的安全模式(sql_safe_updates)

安全模式?在mysql中,如果在update和delete没有加上where条件,数据将会全部修改。不只是初识mysql的开发者会遇到这个问题,工作有一定经验的工程师难免也会忘记写入where条件。为了避免失误造成的数据全部修改和删除,可开启mysql的安全模式。

dzqxwzoe的博客 5389

【重学 MySQL】十二、SQL 语言的规则与规范

SQL(Structured Query Language,结构化查询语言)的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维护性的基础。

优快云全栈领域优秀博主,阿里云博客专家,工信部权威认证物联网技术开发工程师,曾30分钟高分通过C语言二级,两天手撸代码完成EasyX飞机大战,靠接软件私活一个月换苹果电脑 2266

深入理解 MySQL 中的 SQL_MODE

SQL_MODE 是 MySQL 数据库中的一个系统变量,用于控制 MySQL 如何处理 SQL 语句和数据校验。它可以看作是一组约束和规范,确保数据的准确性、完整性和一致性。例如,可以控制如何处理无效日期、是否允许插入不完整的记录、是否区分大小写等。完成不同严格程度的数据校验,有效地保障数据准确性。保证大多数 SQL 符合标准的 SQL 语法,这样应用在不同数据库之间进行迁移时,则不需要对业务 SQL 进行较大的修改。在不同数据库之间进行数据迁移之前,通过设置 SQL_MODE。

ActionTech的博客 3049

《小迪网络安全笔记》 第十二节:WEB漏洞-SQL注入之简要SQL注入

前言 在本系列课程学习中,SQL注入漏洞将是重点部分,其中SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关SQL注入的核心。同样此类漏洞是WEB安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。 注:左边的比右边的难,学习顺序为从右向左。 一、忍者安全测试系统使用说明 二、上述思维导图简要说明 操作系统:windows和linux对大小写敏感不同,如果查了操作系统可以避免这个问题。 数据库名:如果不知道数据库名查询的时候会有问题。

小陈的博客 5156

系统开发SQL中的安全问题

回到首页☞ 早些年IT行业是以功能实现为主,现在随着业务的推行,系统不再孤立,防止安全渗透是重要的工作项。 就像做自动化平台,可以节约人力实现百万服务器的自动运维,同样也可以批量获取root权限,格式化全量服务器。 做平台项目安全终于功能,当一个系统能力越大同样被渗透后破坏也就更大。 定位: 这里作为开发人员,不做深入探讨。 1、SQL注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之

JDIT的博客 514

MySQL中的SQL执行流程

SQL执行流程 MySQL的配置文件的位置 /etc/my.cnf MySQL中的SQL执行流程 MySQL的查询流程 查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,如果进入到解析器阶段。需要说明的是,因为查询混窜往往效率不高,所以在MySQL8.0之后就抛弃了这个功能 MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,va

main_Scanner01的博客 2339

SQL 语句在 MySQL 中的执行过程

SQL 语句在 MySQL 中的执行过程

majc111111的博客 924

MySQL数据库安全:如何防范SQL注入攻击

1.背景介绍 1. 背景介绍 SQL注入攻击是一种常见的网络攻击方法,它利用了数据库管理系统的漏洞,从而滥用其功能。攻击者通过在SQL语句中插入恶意代码,从而控制数据库的操作,窃取或破坏数据。这种攻击对于企业和个人数据的安全构成了重大威胁。 MySQL是一种广泛使用的关系型数据库管理系统,它在网络应用中扮演着重要的角色。因此,了解如何防范MySQL数据库的SQL注入攻击具有重要意义。 本文...

AI天才研究院 1877
上一篇: MySQL(十一)------ 事务控制和锁定语句
下一篇: MySQL(十三)------ SQL Mode相关问题
TheGodsHand
博客等级 码龄9年 27粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值