背景
在优达学城看关系数据库的课程,复习一下数据库的知识。发现了两点以前有了解但是没有太注意的地方。
- SQL注入攻击
- 脚本注入攻击
SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入攻击属于数据库安全攻击手段之一,可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。
SQL注入攻击会导致的数据库安全风险包括:刷库、拖库、撞库。
在课程中谈到的最基本的一种SQL注入攻击,是利用后端数据库插入命令相关代码的疏忽。
例如:
# python连接mysql
import mysql.connector
DB = mysql.connector.connect(user='XXX',password='pw',database='db',use_unicode=True)
c = DB.cursor()
c.execute("insert into TABLE (column) values ('%s')", content)
DB.commit()
DB.close()
代码的问题在于,在把用户输入的内容放入数据库的请求语句中时,采用了不安全的方式。这里的 insert 语句,用引号括住需要写入数据库的字符串。当攻击者在输入框中填写 '); delete from TABLE;
,那么相当于传入了另一条SQL语句(该语句是清空 TABLE表),并不是单纯的文本值。
当然,这只是很基本的一个展示,但需要引起关注!
解决方法:
# 使用元组参数来执行调用
c.execute("insert into TABLE (column) values (%s'\)", (content,))
脚本注入攻击
在网站中,脚本攻击是最常见的一种恶意攻击,即脚本注入(Script Injection),它在通过浏览器使用用户输入框插入恶意标记或脚本代码时发生。一般是指javascript脚本。
Javascript注入攻击指的是通过在网页地址后加JavaScript代码,影响系统运作。
JavaScript注入漏洞能发生作用主要依赖两个关键的动作,一个是用户要能从界面中注入JavaScript到系统的内存或者后台存储系统中;二是系统中存在一些UI会展示用户注入的数据。
属于是一种跨站脚本攻击
在课程中谈到的最基本的一种脚本注入攻击,是利用网站的输入框,填写javascript脚本产生大量垃圾信息(还有一种是,一直弹框令浏览器无法正常使用)。
例如:
// 在网站的输入框输入以下内容
// 该脚本会定时提交垃圾信息
<script>
setTimeout(function() {
var tt = document.getElementById('content');
tt.value = "<h2 style='color: #FF6699; font-family: Comic Sans MS'>Spam, spam, spam, spam,<br>Wonderful spam, glorious spam!</h2>";
tt.form.submit();
}, 2500);
</script>
代码的问题在于,对于用户输入的内容,没有考虑到这些语句对于网页解析来说是有特殊意义的。一般做法就是将输入的文本,有针对性的进行转换,永远都被当成是文本,而非javascript代码。对于 Python 来说,有一个很好用的库 bleach。
解决方法:
# 使用 bleach库 进行文本转换
import bleach
c.execute("insert into TABLE (column) values (%s'\)", (bleach.clean(content),))