前端-接入層注入問題

接入層注入

關係型數據庫

  • 存放結構化數據
  • 可高效操做大量數據
  • 方便處理數據之間的關聯關係
  • 常見: access/sqlite(db 結尾,通常用於手機)/mysql/mssql server

sql 語言

  • select * from table where id = 1
  • 標準化
  • 相似於天然語言的描述性語言
  • 用於關係型數據庫
  • 可完成增刪改查以及各類複雜數據庫操做

sql 注入

`select * from table where id = ${id};`
`1 or 1 = 1`
`select * from table where id =1 or 1 =1;`
select * from user where username = '${data.username}'
and password = '${data.password}'

1 'or '1'='1

select * from user where username = 'username'
and password = '1' or '1'='1'

SQL 的注入本質是將數據變成了具備邏輯的程序javascript

一些神奇的 SQL 語法

select * from table where id="10" and 1=0
select * from table where id="10" and 1=1
select * from table where id="10" and mid(version(),1,1)=5--猜數據庫的版本
select 1,2,3 from table
select id,1,2,3 from table
select * from table union select 1,2,3 from table2--猜字段個數
select * from table where min(username,1,1)="t"--猜用戶名

SQl 注入的危害

  • 猜解密碼
  • 獲取數據
  • 刪庫操做
  • 拖庫

SQL 注入防護

  • 關閉錯誤輸出
    • 經過將錯誤信息模糊化
console.log("[/site/post] error:", e.message, e.stack);
ctx.body = {
  status: -1,
  body: "出錯了"
};
  • 檢查數據類型
  • 對數據類型進行轉義
let id = ctx.parmas.id;
id = parseInt(id, 10);
const post = await query{
    `select * from post where id =${connecttion.escape(id)}`//escape進行轉義

    // 有的時候支持下面這種操做
    `select * from post where id = ?`, [id]
}
  • 使用參數化查詢
    • 選安裝第三方庫 運行npm install mysql2
    • mysql2,和 mysql 不同,不是同一我的寫的,可是 mysql2 向下兼容 mysql

這個時候就要改一下引入的 mysql 庫,還有 queryjava

const query = bluebird.promisify(
  connection.execte.bind(connectionModel).getConnection()
);
//原來是
const query = bluebird.promisify(
  connection.query.bind(connectionModel).getConnection()
);
  • 使用 ORM(對象關係映射)
    • 須要安裝第三方插件
    • 運行npm install sequelize --save

初始化 ORM 實例mysql

var Sequelize = require("sequelize");

var sequelize = new Sequelize({
  host: "localhost",
  database: "safety",
  username: "root",
  define: {
    freezeTableName: ture
  }
});

module.exports = sequelize;

處理數據表sql

var sequelize = require("./sequelize");
var Sequelize = require("sequelize");

var Post = sequelize.define(
  "post",
  {
    id: {
      type: Sequelize.INTERGER,
      primaryKey: ture
    },
    title: Sequelize.STRING(256),
    imgUrl: Sequelize.STRING(256),
    content: Sequelize.TEXT
  },
  {
    tableName: "post"
  }
);

module.export = Post;

查詢操做數據庫

let post = await Post.findById(id);
let comment = await Comment.findAll({
  where: {
    postId: post.id
  }
});

nosql 注入和防護

看一段 nosql 代碼npm

var mongoose = require('mongoose');
login async function(ctx) {
    var username = ctx.request.body.username;
    var password = ctx.request.body.password;

    mongoose.findOne({
        username: username,
        password: password
    })
}

看似沒有什麼問題,實際上是有問題的,nosql

好比:{"name":"user""password""{"$gt":0}}async

這樣密碼當密碼大於 0 時就能夠進行登陸,也就是任意密碼都行,固然用戶名也是能夠這樣操做的mongoose

跟關係型同樣,從這幾方面入手post

  • 檢查數據類型
  • 類型轉換
  • 寫完整條件
相關文章
相關標籤/搜索