# 系统安全相关

# sql 注入:窃取数据库内容

web 2.0就有了sql注入攻击; 攻击方式:输入一个sql片段,最终拼接成一段攻击代码,比如在登录的时候,用户名使用sql语句来进行操作数据。 最简单的,我们一般登录的sql是:

select username,realname from users where username = 'zhangsan' and password = '123'
-- 我们可以将用户名传入下面的字符串,-- 是 mysql 中的注释语句,下面的 sql 直接注释了 password ,去除了密码的验证
select username,realname from users where username = 'zhangsan'--' and password = '123'
-- 后面的密码就没什么用了。如果用户输入下面的sql,会直接删除所有用户信息
select username,realname from users where username = 'zhangsan';delete from users--' and password = '123'

预防措施:使用 mysqlescape 函数处理输入内容即可: mysql.escape。

// 执行 sql 方法
const mysql = require('mysql')
const { MYSQL_CONF } =  require('../config/db')
// 创建连接对象
const con = mysql.createConnection(MYSQL_CONF)
// 开始连接
con.connect()

// 统一执行 sql 的函数
function exec(sql) {
  const promise = new Promise((resolve, reject) => {
    con.query(sql, (err, result) => {
      if(err) {
        reject(err)
        return
      }
      resolve(result)
    })
  })
  return promise
}
module.exports = {
  exec,
  escape: mysql.escape
}

// 使用 exec 以及 escape
const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')
const login = (username, password) => {
  // 防止sql注入
  username = escape(username)

  // 生成加密密码
  password = genPassword(password)
  password = escape(password)

  // 删除单引号-------------注意这里如果使用了 escape 不需要单引号
  const sql = `select username,realname from users where username =${username} and password =${password}`
  return exec(sql).then(rows => {
    return rows[0] || {}
  })
}
module.exports = {
  login
}

他会将

-- 没有使用 escape 防止 sql 注入的 sql 语句
select username,realname from users where username = 'zhangsan'--' and password = '123'
-- 使用 escape 处理过后的 sql 语句
select username,realname from users where username = 'zhangsan\'--' and password = '123'

攻击方式:在页面展示内容中掺杂 js 代码,以获取网页信息 预防措施:转换生成 js 的特殊字符 转换特殊字符

& -> &
< -> &lt;
> -> &gt;
" -> &quot;
' -> &#x27;
/ -> &#x2F;

比如,我们创建博客的时候,输入内容:

<script>
alert(document.cookie)
</script>

用户输入上面的内容,再次展示博客的时候,页面会弹出信息。 我们通过安装依赖

npm install xss --save

使用:

const xss = require('xss')

const newBlog = (blogData = {}) => {
  // 防止xss攻击
  const title = xss(blogData.title)
  const content = xss(blogData.content)
  const author = blogData.author
  const createTime = Date.now()

  const sql = `
    insert into blogs (title, content, createtime, author)
    values ('${title}', '${content}', '${createTime}', '${author}');
  `
  return exec(sql).then(insertData => {
    return {
      id: insertData.insertId
    }
  })
}

# 密码加密:保障用户信息安全

// node 的一个加密的库
const crypto = require('crypto')

// 密匙
const SECRET_KEY = 'jieC_787#*'

// 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
}

评 论:

更新: 11/21/2020, 7:00:56 PM