点击上方"IT牧场",选择"设为星标"技术干货每日送达!

来自:ImportNew

链接: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关键字不就可以了么?

的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『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注入。

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

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术讨论群

近期热文

•瓜子二手车在 Dubbo 版本升级、多机房方案方面的思考和实践•Java12可用新特性一览•聊聊 Java 的几把 JVM 级锁•如何设计一个安全的对外接口?•SQL 性能优化梳理•垃圾回收-实战篇


想知道更多?长按/扫码关注我吧↓↓↓>>>技术讨论群<<<喜欢就点个"在看"呗^_^

聊聊 SQL 注入那些事儿相关推荐

  1. 聊聊 SQL 注入攻击

    sql注入是一个很基础的问题,一说大家都好像知道,听说过,如果再细说说,什么sql注入攻击,怎么sql注入攻击,sql注入攻击有什么危害,十有八九都说不清楚,因此,本篇文章就来聊聊这些问题. 什么是 ...

  2. sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?

    目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...

  3. Youke365_2_4 一处Sql注入漏洞以及一处任意文件删除

    本文作者:X_Al3r Prat 0 自白 每一天都是新的一天. 没啥吐槽的,步入正题 /system/category.php 文件一处Sql注入## 80-87行代码 $root_id = int ...

  4. C#中的依赖注入那些事儿

    目录 目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依 ...

  5. 攻击JavaWeb应用[3]-SQL注入[1]

    园长 · 2013/07/16 18:28 注:本节重点在于让大家熟悉各种SQL注入在JAVA当中的表现,本想带点ORM框架实例,但是与其几乎无意,最近在学习MongoDb,挺有意思的,后面有机会给大 ...

  6. sql注入详解 一文了解sql注入所有常见方法

    前言 刷完了sqli-labs 对sql注入有了些许认识 在此做个小结与记录 1.什么是sql注入 sql,Structured Query Language,叫做结构化查询语言,管理数据库时用到的一 ...

  7. 一条SQL注入引出的惊天大案

    前情回顾:   WAF公司拦截到一个神秘的HTTP数据包,在这个包的表单字段中发现了SQL语句.目标指向80端口,而这正是nginx公司的地盘.   详情参见:一个HTTP数据包的奇幻之旅 虚拟机的世 ...

  8. 一条SQL注入引出的惊天大案 (续篇)

    前情回顾: WAF公司拦截到一个神秘的HTTP数据包,在这个包的表单字段中发现了SQL语句.目标指向80端口,而这正是nginx公司的地盘. 详情参见:一个HTTP数据包的奇幻之旅 1 虚拟机的世界 ...

  9. [Z]依赖注入那些事儿

    写在前面的话 昨天在博客园上看到一篇博文,名为"什么是依赖注入?(来听一个笑话)"[点击这里访问].可以看出,作者是想以一种轻松幽默的方式对依赖注入的思想进行一个阐述.不过在读完文 ...

最新文章

  1. 常见浏览器兼容问题、盒模型2种模式以及css hack知识讲解
  2. centos 7.1 yum
  3. 【安装】Linux系统(X64)安装Oracle 11g
  4. 【干货】迅雷产品经理:浅析用户成长体系
  5. Spring-aop注解开发(切点表达式的抽取)
  6. nginx 上传文件漏洞_nginx解析漏洞复现
  7. python 列表数据类型 200221
  8. 一文看懂压敏电阻和tvs的区别
  9. Vue脚手架中添加favicon.ico图标失效问题
  10. 五分钟快速过完Verilog HDL基本概念(5)数据类型
  11. linux学习笔记:yum命令的常见用法
  12. Javascript特效:关闭小广告
  13. 2022-2028年中国智慧教育行业发展策略分析及投资前景研究报告
  14. Mesh网格编程(三) 正12面体
  15. C# 破解 Reflector8.5
  16. The server encountered an internal error that prevented it from fulfilling this request.
  17. react移动端登录(第三方登录)和个人执行实现
  18. 能自我学习的AI 能辨识20种乐器声音
  19. Java操作Excel并显示到网页
  20. 启动kibana报错:Elasticsearch cluster did not respond with license information

热门文章

  1. Python 点滴积累(4)
  2. ffmpeg录屏及截图
  3. VBS 计算汉字笔画数
  4. mysql 的或表达式_MySQL表达式学习小结
  5. nvidia-smi 无进程占用GPU,但GPU显存却被占用了很多
  6. C++ pointerreference
  7. oracle rac vip不通,oracle RAC环境vip异常的修复
  8. echarts出现异常竖线的解决办法
  9. android 动画教程,Android 动画Animation
  10. Weighted Logistic Regression和Youtube时长预估