接入层注入问题
数据库里有关系型数据库
关系型数据库:
- 存放结构化数据
- 可高效操作大量数据
- 方便处理数据之间的关联关系
- 常见:access/sqlite/mssql server
——————
- Access mdb小型
- sqlite 文件型 嵌入型.db并发有问题
- Mysql 开源 oracle下的 不是文件型 是提供服务的 默认3306 协议通信
- Mssql server 微软 收费
SQL语言:
- select * from table where id = 1
- 标准化
- 类似自然语言的描述性语言
- 用于关系型数据库
SQL注入:
select * from table where id = ${id};
id = 1 or 1 = 1;
影响了原来的语义
——————————————————————————
数据 -> 程序
数据还有程序逻辑了
几个例子:
-
Select * from table where id=“10” and 1=0 后面错误 就都不成立返回错误信息
-
Select * from table where id=“10” or 1=1 查询到任意一条
-
Select * from table where id=“10” and mid(version(),1,1)=5 得到版本版本号
-
Select 1,2,3 from table 所有查出来都是123
-
Select id,1,2,3 from table id加123
-
Select * from table union select 1,2,3 from table2 联合 把后面结果附加到前面的表上
-
Select * from table where mid(username,1,1=“t” 探测 和union一起
- And 1 =1, and 1=0
- 恒等恒不等
- Or 1=1
- 信息泄露
- 有权限控制 就可以看别人的数据了
- 探测服务器版本 10" and mid(version,1,1)=5
- 还可以加union 来猜有几个字段
- 还可以猜表结构 还可以猜用户名
- 前面的不存在后面的存在的话可以看到后面的内容
- 可以直接拿到用户密码帐号
SQL注入的危害
- 猜解密码
- 获取数据库
- 删库删表
- 拖库
SQL注入防御:
1.隐藏错误提示
ctx.body = {
status: -1;
body: 'error';
}
2.检查数据类型
let id = ctx.params.id;
id = parseInt(id, 10);
3.数据进行转义
4.使用参数化查询
const mysql = require('mysql2')
const post = await query(
'select * from post where id = ?', [id]
)
5.使用ORM(对象关系映射)
var Sequelize = require('sequelize');
var Post = sequlieze.define('post', {
id: {
type: Sequelize.INTERGER,
primaryKey: true
}
title: Sequelize.STRING(256),
imgUrl: Sequelize.STRING(256),
content: Sequelize.TEXT
}, {
tableName: 'post'
})
module.exports = Post;