首页 > 数据库 >浅谈SQL注入及其防御方法

浅谈SQL注入及其防御方法

时间:2023-07-30 11:44:52浏览次数:29  
标签:浅谈 命令 漏洞 防御 SQL 特殊符号 id 注入

昨晚跟学生们在群里讨论到什么是SQL注入的时候, 硬挤出来了一个比喻. 码字不易, 特整理记录如下. 

 

首先, 电脑里面的语言分两种, 编译型, 解析型(脚本型). 比如PHP就是解析型, C就是编译型.

由于SQL语句可以在这两类语言下执行, 所以为了充分明白是什么导致了SQL注入漏洞, 我们先来讨论一个问题: 什么是SQL注入漏洞的通用表现形式, 它的本质是什么?

 

SQL注入通常就是在一个查询语句的最后, 比如"Select * from users where id = '$id' " 中的id部分, 通过一些特殊的语法, 修改原本这个SQL查询语句的原意, 比如通过输入框让id等于: ' or 1=1

从而把所有的用户信息列出.

 

这个攻击方法就好比, 我们在进行故事接龙, 我说:"你来到一个古堡门前, 颤颤巍巍地打开了一个木门, 突然, 里面冲出来了", 本来恐怖氛围渲染得好好的, 接龙的非要搞破坏, 硬是要接"我的妈妈, 原来她在里面当NPC, 瞬间就扭着我耳朵带我回家了". 整个氛围瞬间就毁了. 

如果再推而广之, 讨论下什么叫漏洞, 我会说是程序的运行超出了程序员最开始设想的道路.当然, 超出预期的运行结果有很多, 这里讲的SQL注入主要是说一个命令原本已经定下了大半, 但因为恶意用户的恶意输入导致命令原意被变化.

如果这个命令原本仅仅只是缺一个合法的宾语. 动词,  用户的输入有限, 那么不会发生注入漏洞. 如果语言非常灵活, 可以通过一些特殊符号扭转整个命令的原意, 注入漏洞就出现了.

有同学提问, 机器是怎么知道命令的原意呢? 我的答案是, 机器在拿到具体指令前根本不知道. 所以, 如果程序员原本设定好一个命令, 但在运行之前有给人篡改的机会, 那就会造成漏洞.

 

C语言这种编译型语言, 程序员写好程序之后, 马上编译成机器码, 这样用户想要改变命令, 就只有改变机器码.

对于SQL语句而言, 我们看到的很多情况下, 整个指令都是以字符串存在的, 如果中间有参数等待扩展, 比如上面的例子, 那么很可能会出现漏洞.

 

防御思路:

既然知道了这类攻击的大致方法就是通过"关联词"或者说"特殊符号"来修改句子的原因, 那么最简单的防御思路就是把这些特殊符号统统屏蔽, 一旦遇到直接报错.

或者再简单点, 不让用户自由输入, 而给他们一个选择列表. (当然这个列表实现得不好也可能会被攻击, 这是另外的问题.)

 

但还有一个思路, 既然这些关联词/特殊符号只属于原始命令的语法, 那我在执行这个命令之前, 把它翻译成另一种新语言, 这种新语言无法处理原语言的语法, 那么这些特殊符号就失效了. 比如, #在SQL里面经常用来做注释用途, 但在机器码里面不会说遇到#的ascii码就注释掉后面的内容. 因此, 如果把上面这个SQL命令预编译成机器码, 然后在需要id的部分弄成一个指针. 这样无论进来什么特殊符号, 都会只当作是一个普通符号来处理.

 

总结: 所谓SQL注入漏洞, 在我看来就是看输入的内容是否会改变机器拿到的"命令"原意. 要防御, 要么屏蔽造成句子含义变化的特殊符号, 要么就直接把原来的命令翻译成别的语言, 从而让这些特殊符号失效.

标签:浅谈,命令,漏洞,防御,SQL,特殊符号,id,注入
From: https://www.cnblogs.com/lynnzixing/p/17591203.html

相关文章

  • Mysql数据库中数据量特别大,读取特别慢,已经做了索引,怎么优化
    当MySQL数据库中的数据量特别大,读取操作变得特别慢,即使已经添加了索引,仍然需要进一步优化。下面是一些建议以及示例代码来优化这种情况:使用合适的索引:确保为频繁查询的列添加了合适的索引。可以使用EXPLAIN语句来分析查询的执行计划,检查是否正确使用了索引。示例代码:sqlCopycodeE......
  • Sqli-labs靶场之SQL手注通关详解(Less 1~10)
    Less-1 GET-Errorbased-Singlequotes-String判断注入点,这里的页面中没有可以注入的地方,因此可以判断注入点在url栏。判断注入类型id=1and1=1页面正常id=1and1=2页面正常id=1'and1=1--+页面正常id=1'and1=2--+ 页面正常由此可以判断该注入......
  • 不启动SpringBootApplication 直接测试mybatis 下面xml中的sql
     测试类 privatestaticSqlSessionsqlSession=null;privatestaticRunoobTblMappermapper; @BeforeClasspublicstaticvoidsetUpMybatisDatabase()throwsIOException{InputStreamresourceAsStream=null;try{ClassLoaderclassLoader=R......
  • 浅谈数据库分库分表
    目录1.分库分表是什么2.为什么进行分库分表3.有哪些解决方案4.总结本文主要介绍数据库分库分表相关的基础知识,包括分库分表是什么,为什么要分库分表,以及有哪些解决方案。1.分库分表是什么数据库分库分表,用英文表示是"databasesharding"or"databasepartitioning"。分库分表......
  • MySQL学习-DML(Data Manipulation Language)数据--select语句02
    表连接:分为内连接和外连接,常用内连接。当需要同时显示多个表中字段时,就可以用表连接。内连接:仅选出两张表中互相匹配的记录外连接:还会选出其他不匹配的记录外连接包含左连接和右连接左连接: ......
  • 6、Mysql创建用户以及授权
    文件夹就是数据库文件就是表数据行就是行 data下的mysql这个数据库里有张User表,里面保存了用户信息 showdatabases;查看所有数据库 usemysql;使用这个use数据库(进入这个文件夹) showtables;查看这个数据库下所有的表(文件)文件最后有个user,我们登陆mysql服务器......
  • PYTHON mysql形成分割文件
    importrandom,string,re,time,sys,hashlib,pymysql,requestsf=open("aa.txt","w")connect=pymysql.connect(user='root',password='123456',db='new',host......
  • 在SQL Server中新建了SQL Server authentication用户却连不上
    在SQLServer中新建了一个SQLServerauthentication用户Super,也设置了密码:但是使用SQLServerAuthentication连接的时候,用户Super怎么也连不上:折腾了半天,原来发现是SQLServer服务器的SQLServer Authenticationmode没有开启,在SSMS中选中SQLServer服务器,右键点击Properti......
  • 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES
    MySQL的加解密及压缩函数许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发......
  • MySQL慢查询解析
    文档课题:MySQL慢查询解析.数据库:mysql5.7.211、建测试表1.1、建表结构.mysql>usebooksDB;ReadingtableinformationforcompletionoftableandcolumnnamesYoucanturnoffthisfeaturetogetaquickerstartupwith-ADatabasechangedCREATETABLE`t_user......