先来看一副很有意思的漫画:

相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。

何谓SQL注入?


SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。

SQL数据库操作示例

import sqlite3# 连接数据库
conn = sqlite3.connect('test.db')# 建立新的数据表
conn.executescript('''DROP TABLE IF EXISTS students;CREATE TABLE students(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL);''')# 插入学生信息
students = ['Paul','Tom','Tracy','Lily']for name in students:query = "INSERT INTO students (name) VALUES ('%s')" % (name)conn.executescript(query);# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

点击运行按钮将会打印目前表中的内容。上述程序中我们建立了一个test.db数据库以及一个students数据表,并向表中写入了四条学生信息。

那么SQL注入又是怎么一回事呢?我们尝试再插入一条恶意数据,数据内容就是漫画中的"Robert');DROP TABLE students;--",看看会发生什么情况。

SQL数据库注入示例

conn = sqlite3.connect('test.db')# 插入包含注入代码的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES ('%s')" % (name)conn.executescript(query)# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

你将会发现,运行后,程序没有输出任何数据内容,而是返回一条错误信息:表单students无法找到!

这是为什么呢?问题就在于我们所插入的数据项中包含SQL关键字DROP TABLE,这两个关键字的意义是从数据库中清除一个表单。而关键字之前的Robert');使得SQL执行器认为上一命令已经结束,从而使得危险指令DROP TABLE得到执行。也就是说,这段包含DROP TABLE关键字的数据项使得原有的简单的插入姓名信息的SQL语句

"INSERT INTO students (name) VALUES ('Robert')"

变为了同时包含另外一条清除表单命令的语句

"INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;--"

而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。

如何防止SQL注入问题


那么,如何防止SQL注入问题呢?

大家也许都想到了,注入问题都是因为执行了数据项中的SQL关键字,那么,只要检查数据项中是否存在SQL关键字不就可以了么?的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。

合理的防护办法有很多。首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并不是students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况——SQL注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成功攻击的概率。

使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。

另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,比如在上述的案例中,如果我们稍加修改,首先使用execute()方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免SQL注入的问题,如下所示:

SQL数据库反注入示例

conn = sqlite3.connect('test.db')# 以安全方式插入包含注入代码的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES (?)"conn.execute(query, [name])# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

而对于PHP而言,则可以通过mysql_real_escape_string等方法对SQL关键字进行转义,必要时审查数据项目是否安全来防治SQL注入。

当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。

链接:https://jizhi.im/blog/post/sql_injection_intro


数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!


公司简介  | 招聘 | DTCC | 数据技术嘉年华 | 免费课程 | 入驻华为严选商城

zCloud | SQM | Bethune Pro2 | zData一体机 | MyData一体机 | ZDBM 备份一体机

Oracle技术架构 | 免费课程 | 数据库排行榜 | DBASK问题集萃 | 技术通讯

升级迁移 | 性能优化 | 智能整合 | 安全保障 |  架构设计 | SQL审核 | 分布式架构 | 高可用容灾 | 运维代维

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

不会SQL注入,连漫画都看不懂了相关推荐

  1. AI:连漫画都看不懂,谈什么毁灭世界?

    作者:脑极体 全文共 2128 字 4 图,阅读需要 6 分钟 ---- / BEGIN / ---- 作为一个AI垂直自媒体的作者,我工作中的很大一部分就是替AI"带路",然后告 ...

  2. 原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序

    近身边的很多同学都在学习原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序.由于问的人多,所以我也写了个心得,分享一下,老鸟别喷我哈.先贴上代码吧: //返回值: //0,没有任何按键按 ...

  3. sas 检测到开型代码语句的递归_对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历。我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获。...

    源自:7-5 Python之递归函数 对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历.我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获. #if条件不成立的省略 ...

  4. 美国计算机科学奥林匹克竞赛试题acsl,2020年国际数学奥林匹克竞赛试题全部出炉,网友:给答案都看不懂...

    原标题:2020年国际数学奥林匹克竞赛试题全部出炉,网友:给答案都看不懂 为期两天的2020年第61届国际奥林匹克竞赛已经全部结束,而大家比较关心的奥数试卷也全部出炉.从目前五大学科竞赛来看,数学奥赛 ...

  5. 达不达标的公式计算机,“我面试了几百个大学生都不达标,发现他们连这3个Excel公式都看不懂!”...

    原标题:"我面试了几百个大学生都不达标,发现他们连这3个Excel公式都看不懂!" 顶公众号或 设为星标,否则可能收不到文章 当今职场竞争日益激烈,很多用人单位都提高了对求职者的各 ...

  6. 连老板吃鱼都看不懂,还怎么在职场上混?

    连老板吃鱼都看不懂,还怎么在职场上混? 这天是周末,按照惯例,单位的人又要聚在一块喝酒.马老板说这是深入基层.联系员工的最佳途径.马老板喜欢吃鱼,在点菜的时候自然少不了点这道菜. 酒过三巡,菜过五味, ...

  7. 良心SQL注入手工教程(看完血虐sqlilabs全关)

    声明 学习SQL注入,不要只会工具,多看一些原理层的东西,提升会很快,想好好学SQL注入的,务必把这一块拿下 正文 在了解SQL注入前,建议先去了解一下SQL相关的知识,本文中看一先看看附录,那里面有 ...

  8. SQL注入分类,一看你就明白了。SQL注入点/SQL注入类型/SQL注入有几种/SQL注入点分类

    「作者主页」:士别三日wyx 「作者简介」:CSDN top200.阿里云博客专家.华为云享专家.网络安全领域优质创作者 SQL注入分类 一.数值型注入 二.字符型注入 1)单引号字符型注入 2)双引 ...

  9. 什么!作为程序员你连英文版的官方文档都看不懂?

    目录 一.笔者英文基础介绍 二.为啥程序员需要阅读官方文档? 三.如何才能无障碍阅读英文文档? 四.坚持!坚持!坚持! 五.来个约定吧! 这篇文章不聊技术,我们来聊一个某种程度上比技术更重要的话题:一 ...

最新文章

  1. Sublime Text安装与使用
  2. Linux查看端口使用状态及启动
  3. 这几部经典纪录片,竟然还有人没看过?
  4. XE7 Unit scope names
  5. JSF通过EL读取List中的值
  6. Apache Spark 完全替代传统数仓的技术挑战及实践
  7. elementui的横向滚动,element-ui中隐藏组件el-scrollbar的使用
  8. mysql存储过程成绩等级_MySQL使用存储过程创建百万级别测试数据
  9. unity之粒子特效制作图片拼合文字效果
  10. 【ARMv8基础篇】NIC-400控制器简介
  11. .net获取mysql数据_asp.net用DataSet从数据库中获取数据
  12. 企业债和公司债的四点区别
  13. ps中如何批量修改图片
  14. n子棋,你能下赢电脑吗,来玩玩吧
  15. JAVA毕业设计html5在线医疗系统计算机源码+lw文档+系统+调试部署+数据库
  16. 服务网关配置:Zuul
  17. java合并流与文件的分割合并示例
  18. SpringBoot+JPA+thymeleaf 菜单分级展示
  19. 2.(cesium篇)cesium加载接入百度地图
  20. 【摸鱼神器】基于SSM风格的Java源代码生成器 单表生成 一对一、一对多、多对多连接查询生成

热门文章

  1. 查询雇佣的所有员工_想要最好的员工? 让他们自己雇用
  2. Spring Boot 应用监控
  3. es6 async函数与其他异步处理方法的比较
  4. CAN笔记(6) CAN协议(一)
  5. Python笔记(3) Python入门
  6. cdt规约报文用程序解析_用 Python 撸一个 Web 服务器第3章:使用 MVC 构建程序
  7. python中如何快速注释_python中如何快捷添加注释
  8. java无穷大 inf_java – 为什么浮点数无穷大,不像NaN,等于?
  9. 08.28 JavaScript 边界 选择修饰符 模式单元 修饰符 正则的使用
  10. 【系统篇】从int 3探索Windows应用程序调试原理