node 安全性

安全性

sql注入

  • 窃取数据库的内容

  • 最原始、最简单的攻击

  • 攻击方式:输入一个sql片段,最终拼接成一段攻击代码

  • 预防措施:使用mysql的escape函数处理输入内容即可

【举例】

比如一个登录网站,需要输入 账号密码

select username,realname from users where username = '${username}' and password = '${password}';

在sql语言中--代表注释,通过这个方法可以注释密码,那么就可以直接登录

输入

zhangsan'--

若数据库中存在zhangsanusername数据,那么在没有设有sql注入的情况下就会直接登录

解决方法

出现以上问题的主要原因为:前后引号的对应,出现的对应错误

使用mysql库中的escape函数

源代码

const { exec } = require("../db/mysql")
const login = (username, password) => {
    const sql = `
        select username,realname from users where username = '${username}' and password = '${password}';
    `
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}

module.exports = {
    login
}

修改后的代码

// src/db/mysql.js
......
module.exports = {
    exec,
    excape:mysql.excape
}
const { exec,escape } = require("../db/mysql")
const login = (username, password) => {
    username = escape(username)
    password = escape(password)
    const sql = `
        select username,realname from users where username = ${username} and password = ${password};
    `
    console.log(sql)
    return exec(sql).then(rows => {
        return rows[0] || {}
    })
}

module.exports = {
    login
}

区别:修改处使用了escape函数,并且在sql语言中少了’’(引号)

escape函数的主要作用就是将输入的内容进行转义并且加上引号,例如将'变为了/'避免出现引号对应产生的威胁

xss攻击

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

【案例】

创建新博客

当我们创建的新博客的时候,需要写入 博客标题博客内容,将其存入到数据库中

之后获取博客列表的时候,是通过循环进行渲染的

此时就容易出现xss攻击

比如:

我们在写博客标题的时候写入<script>console.log(document.cookie)</script>

当前端代码进行渲染的时候因为这是一行js代码,所以就会执行

安装xss

npm install xss --save --registry=https://registry.npm.taobao.org
const xss = require('xss')
const inputValue = content // 未进行xss防御
const inputValue = xss(content) // 已进行xss防御

然后如果在 input 输入框 恶意输入 <script> alert(1) </script>, 就会被转换为下面的语句并存入数据库:

<script> alert(1) </script>,已达到无法执行 <script> 的目的。

密码加密

  • 保障用户信息安全
  • 万一数据库被用户攻破,最不应该泄露的就是用户西南西
  • 攻击方式:获取用户名和密码再去尝试登录其他系统
  • 预防措施:将密码加密,即使拿到密码也不知道明文
// 加密算法
const crypto = require('crypto')

// 密钥
const SECRET_KEY = 'GYIgiua%(abiua_'

// md5加密
function md5 (content) {
    // 创建md5的加密
    let md5 = crypto.createHash('md5')
    // 'hex'w
    return md5.update(content).digest('hex')
}

// 加密函数
function genPassword (password) {
    const str = `password=${password}&keyword=${SECRET_KEY}`
    return md5(str)
}

module.exports = {
    md5
}

使用场合:

  1. 注册的时候,将加密的密码存入到数据库中
  2. 在登录的时候,通过加密之后再去查询数据库

注意点:先进行加密后进行转义(escape),因为转义之后是自动加上引号的,那么sql语句就不用添加引号

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值