跟我一起学NodeJS之安全

2020-05-06  本文已影响0人  喜剧之王爱创作

安全

本篇介绍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端的开发。回顾一下吧~

上一篇下一篇

猜你喜欢

热点阅读