iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
1
Software Development

Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰系列 第 21

Day21-收網 I(連接資料庫)

今日目標

收網部分會實作 把釣到的魚(帳號密碼)存起來,並且做一個簡單的 ui 查看成果 ,總共會分成三篇

為了把釣到的魚存起來我們需要一個資料庫,今天第一天要做的就是初始化並且連接到資料庫

LedisDB

說到資料庫大家應該都多少聽過 MySQL、MongoDB 之類的,但那些對我們來說都太肥大了,要使用都還要另外安裝,我們只需要一個小小的資料庫來存一些少量的資料,也不需要支援 Transaction 等等,所以這邊筆者我選用 LedisDB,他有幾個特性很適合這種小專案使用

  • 不用另外安裝

    LedisDB 本身就是 Go 寫的,他可以被嵌入(Embedded)在 Go 寫的程式裡面,不用像許多肥肥的資料庫要另外安裝,安裝完還要設定一堆有的沒的

  • 支援 List

    為了要把很多筆帳號密碼存起來,我們需要一個 List(或者說 Array),剛好 LedisDB 也有提供這種資料結構

Subpackage

因為目前 main.go 已經有一百多行扣,如果再把讀取資料庫的扣寫在裡面會太肥,所以這邊要使用 subpackage 把 db 的功能拆分出來,就像寫 Nodejs 或 Python 也不可能把所有扣寫在一個檔案,要拆分成好幾個模組

目錄結構

原本的專案目錄長這樣,只有三個檔案

├── go.mod
├── go.sum
└── main.go

在 Go 裡面每個 package 都要有一個獨立的資料夾,所以現在要新增一個 db 作為這個 subpackage 的資料夾,裡面有一個 db.go

├── db
│   └── db.go
├── go.mod
├── go.sum
└── main.go

在 main 裡面使用

如果要在 main 使用寫在 db.go 內的 Connect,那就要先 import "go-phishing/db" 再用 db.Connect(),簡單明瞭

// ----- db.go -----
package db

func Connect() {
    fmt.Println("connect")
}
// ----- main.go -----
import "go-phishing/db"

func main() {
    db.Connect()
}

實作連接到資料庫

Connect 要負責建立跟資料庫的連線,然後把 db 存到全域變數供其他 function 使用,這部份的實作不用太仔細看,因為筆者我也只是照著他的文件寫XD,所以大概知道是在建立連線就可以了

// ----- db.go -----
import (
    "log"
    
    // 把 LedisDB import 進來
    "github.com/siddontang/ledisdb/config"
    "github.com/siddontang/ledisdb/ledis"
)

var db *ledis.DB

func Connect() {
    // 建立一個設定檔,把資料的儲存位置設定到 ./db-data
    cfg := config.NewConfigDefault()
    cfg.DataDir = "./db_data"

    // 要求建立連線
    l, _ := ledis.Open(cfg)
    _db, err := l.Select(0)

    if err != nil {
        panic(err)
    }

    // 成功建立連線,把 db 存到全域變數,之後其他地方會用到
    db = _db
    log.Println("Connect to db successfully")
}

接著在 main 中跑 db.Connect(),有看到 log 就是成功連上 db 了

// ----- main.go -----
import (
    // ...
    
    "go-phishing/db"
)

func main() {
    db.Connect()

    // ...
}

這時候看看專案目錄會多一個 db_data 資料夾,LedisDB 把所有資料都存在這裡,如果想清空資料庫只要刪掉這個資料夾就可以了,很簡單吧~

├── db
│   └── db.go
├── db_data  # <-- 這個
│   ├── LOCK
│   └── goleveldb_data
├── go.mod
├── go.sum
└── main.go

小結

今天用 LedisDB 作為底層實作了 db.Connect 並且在 main 中使用,commit 放在這裡,對今天的內容有什麼問題都歡迎在底下提問,沒問題的話明天要來實作最重要的 讀/寫 資料庫部分了


上一篇
Day20-Go modules
下一篇
Day22-收網 II(讀寫資料)
系列文
Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰30

尚未有邦友留言

立即登入留言