美文网首页
跟我一起学NodeJS之安全

跟我一起学NodeJS之安全

作者: 喜剧之王爱创作 | 来源:发表于2020-05-06 14:03 被阅读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端的开发。回顾一下吧~

    相关文章

      网友评论

          本文标题:跟我一起学NodeJS之安全

          本文链接:https://www.haomeiwen.com/subject/cjfwghtx.html