跟我一起学NodeJS之安全
安全
本篇介绍web server (Nodejs)层面上存在的安全问题,并解决
sql注入
sql注入就是我们我们在和服务端进行交互时,nodeJS代码会有一些拼sql的方式进行数据库操作,然后就可以在客户端进行一些拼接,达到对数据库的恶意操作的目的(小编自己的理解)
比如,我们在登录时,会拼出这样的sql
select username, realname from users where username=${username} and password=${password};
假如用户名密码为‘zhangsan’、'123',那我们就可以成功登录,但是当用户输入用户名为zhangsan'--
,那么sql就会变成
select username, realname from users where username='zhangsan'-- 'and password='123';
可以发现,密码被我们注释掉了,这时密码就失效了,当然了,也可以利用sql注入现实增删改查任一操作。这是相当危险的。
预防sql注入
好在mysql为我们提供了预防方法,escape
方法,我们将客户端输入的内容用escape
处理,那么就可以避免sql注入。
// escape: mysql.escape我们可以在db里面引入
const login = (username, password) => {
username = escape(username)
password = escape(password)
const sql = `
select username, realname from users where username=${username} and password=${password};
`
return exec(sql).then(rows => {
return rows[0] || {}
})
}
这样就可以了,这次我们再输入上面的代码,生成的Sql就会变成
select username, realname from users where username='zhangsan\'-- 'and password='123';
这样拼接的sql就失效了,我们就成功预防了sql注入
XSS攻击
关于XSS攻击,前端不陌生,这里也不详细介绍,大致为利用一些'<'或者'>'等符号,注入一段JS执行代码,用来进行某种恶意攻击行为,当前前端有应对XSS攻击的手段,同样后端也不能忽视,我们需要在NodeJS中引入xss
这个库
const title = xss(blogData.title)
做这样的处理就好了,这是服务端的过滤手段,前端的处理,这里不赘述。
密码加密:保障用户信息安全(重要)
尽管防止数据库被攻破的手段有很多,但依然有被攻破的风险,所以我们要有一个后备的解决方案,防止数据库被攻破后密码泄露。
这里我们就需要对我们的密码密码进行加密。一般用户名密码是需要注册的,所以大部分的解决方案为
注册时我们将加密后的密码存入数据库,登录时,客户端用明文密码,生成加密后的密码去登录
所以,这里就需要一个加密算法了。代码如下
const crypto = require('crypto')
// 密匙
const SECRET_KEY = 'WJIOL_88776#'
// md5加密
function md5(content) {
let md5 = crypto.createHash('md5')
return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
const str = `password=${password}&key=${SECRET_KEY}`
return md5(str)
}
module.exports = {
genPassword
}
可以看到代码并不难,我们就可以实现密码的加密。用用的时候
password = genPassword(genPassword)
password = escape(password)
这样就可以了。
至此,我们在不使用框架的情况下,就完成了NodeJS web Server端的开发。回顾一下吧~