接入层注入问题
zKing 2018-11-26 Web 安全
# 关系型数据库
- 存放结构化的数据
- 可高效操作大量数据
- 方便处理数据之间的关联关系
- 常见:access/sqlite/mysql/mssql server/Oracle
# SQL语言
- 类似自然语言的描述性语言
- 用于关系型数据库
- 可用于增删改查还有更高级的数据库操作
# SQL注入
SQL 注入有非常多的变化,防不胜防
# 原理
原本是数据的部分变成程序的一部分,改变了程序逻辑
# 危害
- 猜解密码
- 获取数据
- 删库删表
- 脱库
# 防御
- 关闭错误输出
- 检查数据类型
- 对数据进行转义
- 使用参数化查询,原理是将一条sql语句拆分成两条
- 使用 mysql2 模块
- 使用 ORM(Object-Relational Mapping 对象关系映射)
- ORM 基本上是别人写好的
- node.js 中出名的ORM模块是
sequelize
这里以 mysql
为例
cnpm install mysql2 -D
cnpm install sequelize -D
dbConfig.js
module.exports = {
host:'localhost',
port:3306,
user:'test',
password:'123456',
database:'comang',
}
model.js
const Sequelize = require('sequelize');
const dbConfig = require('./dbConfig')
// 连接数据库
var sequelize = new Sequelize(dbConfig.database, dbConfig.user, dbConfig.password, {
host: dbConfig.host,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 30000
},
operatorsAliases: false,
});
// 定义模型
var model = sequelize.define('order', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
goodsname: Sequelize.STRING,
price: Sequelize.DOUBLE,
amount: Sequelize.INTEGER,
ordertime: Sequelize.DATE,
}, {
timestamps: false
});
module.exports = model;
app.js
const model = require('../dbModel/model');
app.use(async (ctx, next) => {
let list = await model.findAll();
for(let e of list){
console.log(e.goodsname);
}
ctx.body = JSON.stringify(list);
});
# NoSQL注入防御
- 检查数据类型
- 类型转换
- 写完整条件