2020年最新的常问企业面试题大全以及答案

来源: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注入

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

(完)

推荐阅读:

Spring的Bean生命周期,11 张高清流程图及代码,深度解析

程序员 6 个接私活的网站,你有技术就有钱!

如何在面试中介绍自己的项目经验?

SpringBoot实现过滤器、拦截器与切片

好文!必须点赞

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

  1. springboot防止XSS攻击和sql注入

    文章目录 1. XSS跨站脚本攻击 ①:XSS漏洞介绍 ②:XSS漏洞分类 ③:防护建议 2. SQL注入攻击 ①:SQL注入漏洞介绍 ②:防护建议 3. SpringBoot中如何防止XSS攻击和s ...

  2. php my wind,PHP My Wind绕过过滤SQL注入(限定条件)

    PHPMyWind设计缺陷绕过过滤SQL注入 我会在标题里面告诉你们其实是全局变量覆盖吗?需要register_globals=on. /include/common.inc.php 注册变量的代码: ...

  3. springboot自带filter实现sql防注入过滤器,可以全路径也可以自己设置过滤路径,还可以在全路径的时候选择放行某些路径不过滤。

    什么是sql注入 SQL注入是比较常见的网络攻击方式之一,在客户端在向服务器发送请求的时候,sql命令通过表单提交或者url字符串拼接传递到后台持久层,最终达到欺骗服务器执行恶意的SQL命令:它不是利 ...

  4. jdbctemplate 执行多条sql_白帽推荐:可以自动检索、挖掘sql注入的神器,sqlmap入门实战

    学习web渗透的小白,必须有一份sqlmap的入门档案,收藏好,以备不时之需哈! Sqlmap介绍 sqlmap是一个自动化的SQL注入工具,其主要功能就是扫描.发现并利用给定的URL的SQL注入漏洞 ...

  5. Springboot集成防sql注入设置

    防sql注入为系统开发最基础的安全开发要求,在此分享基于过滤器和功能可开关的防sql注入写法,仅供学习交流使用. SqlFilterConfigUtils 为sql注入防护开关工具类,可以灵活开启和关 ...

  6. SpringBoot防SQL注入

    新建XssHttpServletRequestWrapper import java.io.BufferedReader; import java.io.ByteArrayInputStream; i ...

  7. 华为java安全编码规范_Java安全编码之SQL注入

    随着互联网的发展,Java语言在金融服务业.电子商务.大数据技术等方面的应用极其广泛.Java安全编码规范早已成为SDL中不可或缺的一部分.本文以Java项目广泛采用的两个框架Hibernate和My ...

  8. 使用#传递参数防御SQL注入攻击

    SQL注入攻击 什么是SQL注入 SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作. 造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器 ...

  9. 常见的Java审计代码函数关键字_转载:Java代码审计汇总系列(一)——SQL注入

    原文链接:https://cloud.tencent.com/developer/article/1534109 一.代码审计 相比黑盒渗透的漏洞挖掘方式,代码审计具有更高的可靠性和针对性,更多的是依 ...

最新文章

  1. 用PaddlePaddle打比赛!
  2. UDP、广播、多播与IGMP(七)
  3. 【读书笔记】iOS-属性列表
  4. 科大星云诗社动态20201118
  5. 分配大小为0的内存和0值进行比较
  6. mac vscode 背景半透明_给 vscode 添加半透明毛玻璃效果
  7. android网页省略分页器,Android轻量级网页风格分页器
  8. iOS 简单引导界面
  9. IO流(八)之InputStreamReader类与OutputStreamWriter类
  10. 详解,c/c++输入输出缓冲区,以及scanf回车的问题
  11. 常见的java设计模式
  12. 三大抽样分布——卡方分布、t分布、F分布
  13. 自定义形状按钮的实现
  14. 计算机软件师倾斜怎么能摆正,ps中怎么把倾斜图案拉直
  15. 我的世界java版如何加披风_我的世界披风怎么导入
  16. [老码团队]Swift中的协议 - 用协议来实现委托模式
  17. 2023考研数学真题及答案解析!
  18. arduino+无源蜂鸣器制作音乐(引入篇)——从结构到原理
  19. 【模拟电子技术】常用半导体器件——本征半导体
  20. 基于SIMULINK的燃烧过程模糊PID控制系统仿真

热门文章

  1. 用 Python 实现手机自动答题,下一个百万获奖人可能就是你!
  2. 别人在加薪,你却在加班?快到这里和聪明的小伙伴一起充电吧!
  3. Java 11 升级:“债务”“危机”
  4. 程序员有哪些丢不掉的编程“陋习”?
  5. 公链史记 | 从鸿蒙初辟到万物生长的十年激荡
  6. 假期还剩 2 天,Python 爬取途牛网,揭秘哪里人少景美!
  7. 7000 亿!华为正式宣布,全世界为之颤抖!
  8. 亚马逊不仅将弃用 Oracle,还要抢 Java 饭碗!
  9. @程序员,你还在加班写 Bug 吗?
  10. 谷歌技术帮助美军方无人机识别更精准