出处:

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

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

今天我们来聊一聊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注入。

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

想了解更多关于数据库、云技术的内容吗?

快来关注“数据和云"、"云和恩墨,"公众号及"云和恩墨"官方网站,我们期待大家一同学习与进步!

小程序”DBASK“在线问答,随时解惑,欢迎了解和关注!

何谓 SQL 注入,这个漫画告诉你相关推荐

  1. 何谓 SQL 注入,这个漫画告诉你!

    先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了.今天我们来聊一聊SQL注入相关的内容. 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段 ...

  2. springboot testcontext @sql_举世闻名的 SQL 注入是什么?这个漫画告诉你!

     2020年最新的常问企业面试题大全以及答案 来源:jizhi.im/blog/post/sql_injection_intro 先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段 ...

  3. 不会SQL注入,连漫画都看不懂了

    先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了.今天我们来聊一聊SQL注入相关的内容. 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段 ...

  4. 反引号注入_什么是 SQL 注入?

    (给ImportNew加星标,提高Java技能) 转自:Java程序员联盟 文章目录: 何谓SQL注入? SQL数据库操作示例 SQL数据库注入示例 如何防止SQL注入问题 SQL数据库反注入示例 何 ...

  5. 什么是SQL 注入?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 来源 ...

  6. 聊聊 SQL 注入那些事儿

    点击上方"IT牧场",选择"设为星标"技术干货每日送达! 来自:ImportNew 链接:jizhi.im/blog/post/sql_injection_in ...

  7. DFX 安全测试-- 告诉你什么是XSS、sql注入?POST和GET的区别....

    1.用户权限测试 (1) 用户权限控制 1) 用户权限控制主要是对一些有权限控制的功能进行验证 2) 用户A才能进行的操作,B是否能够进行操作(可通过窜session,将在下面介绍) 3)只能有A条件 ...

  8. mysql数据库蛛_超级蜘蛛池之何谓为SQL注入?【基础】

    什么是SQL注入? 还记得小学语文考试上的填空题吗? 题目的意图明显是通过填空来了解答题者的名字和爱好. 比如:我是_______________,喜欢__________________ 如果有同学 ...

  9. 防止 SQL 注入的 PHP MySQLi 准备语句教程

    PHP MySQLi Prepared Statements Tutorial to Prevent SQL Injection 介绍 在我开始之前,如果您想了解使用 MySQLi 准备好的语句的更简 ...

最新文章

  1. VUE的本地应用-V-TEXT
  2. 风云编程python-动态排名可视化 | 带你领略编程语言20年风云变化
  3. Java小青蛙跳台街,青蛙跳台阶问题:Java版,递归算法和循环
  4. 转:Node.js和testacular的安装与配置
  5. C++ 判断系统大小字节序
  6. 自动化集成:Pipeline整合Docker容器
  7. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(7-9)
  8. 伺服扭矩模式怎么控制_气液增压缸是怎么增压的?气液增压缸好用吗?气液增压缸的原理及其伺服控制...
  9. PTA 1003 Emergency
  10. codevs3044 线段树+扫描线
  11. rubygems 安装mysql时出错_Ruby gem install mysql 错误解决
  12. 一本院校大三萌妹子须臾:我的大数据之路
  13. LAMMPS分子动力学模拟技术与应用 第一性原理计算方法及应用
  14. 大繁至简,首度揭秘阿里云飞天洛神系统
  15. Confluence(wiki)配置数据库及修改数据库地址
  16. 绿色荧光油溶性CdSe/ZnS量子点(硒化镉/硫化锌)
  17. Linux I/O编程 实验内容
  18. NGFW——安全策略的处理流程
  19. python字母表顺序函数_python获取字母在字母表对应位置的几种方法及性能对比较...
  20. 天基实业做好投资理财规划

热门文章

  1. drupal 迁移_关于如何迁移到Drupal的4个技巧
  2. 哲学家就餐 linux实现_Linux哲学的9个主要原则如何影响您
  3. 设计模式-观察者模式 发布/订阅模式
  4. CSS3 控制Tab宽度 tab-size属性
  5. python0表示剪刀_简化Python代码(石头、纸张、剪刀)
  6. 人之间的尊重是相互的_人与人之间真心是互换的尊重是相互的
  7. java期末判断题题库_(java期末考试选择题题库.doc
  8. 线段树区改区查标记永久化板子
  9. arch 安装准备--包管理的使用pacman
  10. Luogu 3267 [JLOI2016/SHOI2016]侦察守卫