再走Node路:(篇九) node处理安全问题: sql注入,密码加密,xss攻击

笑着哭i 提交于 2019-12-15 18:48:51

经过我们之前的node路的学习,我们基本能够整合各种信息搭建一个小型的服务器系统弄了,那今天我们就来说一下服务器的安全问题: (注意,这里我们说到的只是个大概,就不进行深入了)


我们主要说到的安全问题有三个:

  • sql注入

  • 密码加密

  • xss攻击
    1.关于sql注入,我们举一个简单的例子,他其实就是恶意者对我们数据库的攻击,获取我们数据库中的用户信息等私密的数据,我们之前在连接数据库的时候讲到了一些基本的sql语句,而原生的node的进行开发服务的时候,我们的数据库操作的sql语句是我们进行拼接的,这样就会出现,如果恶意者输入一段带攻击性的sql语句进入时,我们直接拼接到数据库中去执行,就会出现一些意想不到的严重后果,举个例子:

    当我们用户登录时,需要输入用户名和密码,那如果恶意者输入以下有一段信息:
    用户名: zhangsan’ - -
    密码: 随意输入,不是真实的用户密码

那么现在在我们的服务端拼接处sql语句到数据库进行用户查询时的sql语句就会是这样的:

select username, nickname from users where username='zhangsan'--'password=随意输入的密码

如果了解sql语句的人都知道,- - 在sql中是注释,这就相当于在查询时直接将密码条件给注释掉了,这样无论如何都会查询成功,如此恶意者就在没有使用密码的情况下登录成功了,就会导致用户的信息泄露出去,更有甚者,如果传递一下这样一段信息:

用户名: zhangsan’;delete * from users;
密码: 随意

拼接sql后到数据库执行就会是这样:

select username, nickname from users where username='zhangsan';delete * from users;password='任意' 

这样执行后我们的users表中的所有的用户信息不就都被删掉了嘛,所以,诸如此类的情况,我们必须要对我们的输入信息进行处理后才能拿到数据库去执行,其大致的思路其实就是将一些特殊的字符进行转义处理。
mysql库中为我们提供了一个escape()方法可以帮我们进行这种处理,使用起来也很方便

// 引入mysql模块
const mysql = require('mysql')
// 随便定义一段带有攻击性的sql
let sql = 'select username, nickname from users where username='zhangsan'--'password='123''
// 使用escape()方法进行处理:
sql = mysql.escape(sql)
console.log(sql)

经过escape进行处理后的sql语句就是如下这样的:

'select username, nickname from users where username=‘zhangsan’–‘password = ‘123’’

它实际上就是对我们的一些有危害性的字符进行了转意处理, 这样再到我们数据库中执行就不会出现之前的那种情况了.

  1. 对于密码的加密的目的是什么呢,这里我们简单说一下 :
    当我们的数据库如果被黑客攻破,拿到了我们数据库中的数据,那么我们希望我么数据库中的数据对于黑客而言是不能直接使用的,这就要求我们的数据库中的数据不能够是明文,而需要是一些经过加密算法处理过的字符,如果被黑客们拿到,他们也就需要进行解码,这样也就会耗费掉他们的精力,甚至还有可能解码不成功,所以我们对密码加密的作用也就体现出来了。
    node原生提供了一个crypto 模块可以为我们进行数据的加密操作,同一段字符经过加密出来的数据是一样的,所以我们只需要将加密的数据存储到数据库,取数据时我们进行查询的数据条件也进行加密后查询也就是统一的了, 下面我们以常见的md5加密演示一下如何使用:
// 引入 crypto模块
const crypto = require('crypto')
// 定义一段字符作为加密的密匙, 密匙可以随便定义
const SECRET_KEY = 'CHenshao_#$138'

// 创建一个md5加密函数
function md5(content){
	let md5 = crypto.createHash('md5')
	return md5.update(content).digest('hex')  // hex表示将加密后的数据转化为16进制
}

// 定义数据加密函数
function getPassword(password) {
	// 拼接加密字符串,包含需要加密的数据以及加密的密匙
	var str = `password=${password}&key=${SECRET_KEY}`
	return md5(str)
}

// 示例: 假设我们加密的密码为123
const result = getPassword('123')
console.log(result)

上述加密后的123的密码如下:

d5a4f636d35d97d44b7144727594876f

所以我们到时候只需要将这么一段加密后的数据存储到数据库中即可

  1. 最后我们再来说一下 xss 攻击吧,可能前端对于这个东西而言还是比较熟悉的把,其实xss攻击是有很多中类型的,但在服务端来说,多是使用一段js代码执行到客户端获取用户的cookie信息等等,所以我们要做的就是在服务端让它不能够生成js代码块。 思路主要还是对一些js代码块的符号进行转化: 例如

< 符号转化为 &lt
‘>’ 符号转化为 &gt

等等诸如上述的操作,在node中我们可以使用一个 xss 模块来进行这种转化,它的用法也是极其简单的:

// 安装后引入模块:
const xss = require('xss')
// 任意定义一段需要处里的字符:
let str = '<script>alert(document.cookie)</script>'

// xss处理: xss其实就是一个函数,只需要将需要处理的信息传递给它即可
str = xss(str)
console.log(str)

xss处理后的上述字符串打印出的结果如下所示:

 "&lt;script&gt;alert(document.cookie)&lt;/script&gt; "

说到这里我们今天的node路就差不多了,其实安全处理的东西是有特别特别多的东西需要解决的,我们这里只是说了点皮毛,甚至连皮毛都算不上,但是这些工作在实际的开发中多是交给运维的同学他们进行处理的东西,所以大家如果有兴趣可以继续深入研究,这里我么就不做太多的赘述了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!