# 系统安全相关
# 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'
预防措施:使用 mysql
的 escape
函数处理输入内容即可: 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'
# XSS攻击:窃取前端的 cookie 内容
攻击方式:在页面展示内容中掺杂 js
代码,以获取网页信息
预防措施:转换生成 js
的特殊字符
转换特殊字符
& -> &
< -> <
> -> >
" -> "
' -> '
/ -> /
比如,我们创建博客的时候,输入内容:
<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
}
阅读量: