Node.js 从零开发 web server博客项目[安全]

web server博客项目

  1. Node.js 从零开发 web server博客项目[项目介绍]
  2. Node.js 从零开发 web server博客项目[接口]
  3. Node.js 从零开发 web server博客项目[数据存储]
  4. Node.js 从零开发 web server博客项目[登录]
  5. Node.js 从零开发 web server博客项目[日志]
  6. Node.js 从零开发 web server博客项目[安全]
  7. Node.js 从零开发 web server博客项目[express重构博客项目]
  8. Node.js 从零开发 web server博客项目[koa2重构博客项目]
  9. Node.js 从零开发 web server博客项目[上线与配置]

  • SQL 注入: 窃取数据库内容

    • 最原始 , 最简单的攻击 , 从有了 web2.0 就有了 sql 注入攻击
    • 攻击方式 : 输入一个 sql 片段 最终拼接成一段攻击代码
      • select username, realname from users where username='zhangsan'-- 'and password='123'
        用户名:zhangsan'--空格
        此时只需要在浏览器端用用户名登录即可
        用户名:zhangsan';delete from users;--空格 这将删除数据库所有内容
    • 预防措施 : 使用一个 MySQL 的 escape 函数处理输入内容即可
      • 代码实现

controller/login.js

const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')

const login = (username, password) => {
    username = escape(username)
    password = escape(password)

    const sql = `
        select username, realname from users where username=${username} and password=${password}
    `
    ...
  • XSS 攻击 : 窃取前端的 cookie 内容

    • 攻击方式 : 在页面展示内容中参杂 js 代码 , 以获取网页信息
    • 在新建文档中的标题编辑及框中写入<script>alert(document.cookie)</script>
    • 预防措施 : 转换生成 js 的特殊字符
      • 在服务端中转译为&lt;scrit&gt;alert(document.cookie)&lt;/script&gt;
  • 密码加密 : 保障用户信息安全 ( 重要! )

    • 万一数据库被用户攻破 , 最不应该泄露的就是用户信息
    • 攻击方式 : 获取用户名和密码 , 再去尝试登录其他系统
    • 预防措施 : 将密码加密 , 即使拿到密码也不知道明文
      • 代码实现

        • 创建utils/crypto.js
const crypto = require('crypto');

// 密匙
const secret = 'abcdefg';

// sha256加密
function sha256(content) {
  return crypto.createHmac('sha256', secret)
    .update(content)
    .digest('hex');
}

// md5再次加密
function genPassword(password) {
  return crypto.createHash('md5', secret)
    .update(password)
    .digest('hex')
}

module.exports = {
  genPassword
}
  • 使用

ctroller/user.js

const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')

const login = (username, password) => {
    username = escape(username)
    
    // 生成加密密码
    password = genPassword(password)
    password = escape(password)

    const sql = `
        select username, realname from users where username=${username} and password=${password}
    `
    // console.log('sql is', sql)
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}

module.exports = {
    login
}
posted @ 2019-07-10 17:30  仲灏  阅读(629)  评论(0编辑  收藏  举报