<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    ORM 盛行下,你知道真正執行的 sql 么

    VSole2022-08-03 16:11:35

    推薦理由

    在這個 orm 盛行的服務端開發環境下,已經很少有人寫 raw sql 了吧,畢竟 orm 框架可以幫助開發人員屏蔽 db 的細節,同時還能在一定成程度上預防 sql 注入的風險,大多數情況下,對業務代碼的單測,會使用 sqlite 來 mock 真正的 db,以驗證功能的完備性,但當你寫完一條 orm 語句后,是否會校驗,生成的真正執行的 sql 是你的預期么?是否會校驗,在代碼變更的時候 sql 語句是否也發生了變更呢?

    針對以上兩個問題,sqlmock 可以完成對 sql 語句的單側,讓你對 orm 生成的 sql 了如指掌,同時清晰 test raw sql 也讓 review 的同事快樂加倍。

    實現原理

    其實 sql mock 只是實現了 go sql/driver 的接口,用于模擬數據庫的連接,本質上并不會進行存儲數據,只能特定的返回。

    實際栗子

    通過 sqlmock 測試創建 user 的sql語句
    package main
    import (
      "github.com/DATA-DOG/go-sqlmock"
      "gorm.io/driver/mysql"
      "gorm.io/gorm"
      "testing"
    )
    type User struct {
      ID int64 `gorm:"column:id"`
      UserName string `gorm:"column:user_name"`
    }
    func (User) TableName() string {
      return "users"
    }
    func CreateUser(db *gorm.DB, user *User) error{
      return db.Table(user.TableName()).Create(&user).Error
    }
    const (
      rawSQLCreateUser = "INSERT INTO `users` (`user_name`,`id`) VALUES (?,?)"
    )
    func TestShouldUpdateStats(t *testing.T) {
      db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
      if err != nil {
        t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
      }
      defer db.Close()
      dialector := mysql.New(mysql.Config{
        DriverName:                "mysql",
        Conn:                      db,
        SkipInitializeWithVersion:true,
      })
      user := &User{
        ID:       1,
        UserName: "zr",
      }
      gdb, err := gorm.Open(dialector, &gorm.Config{})
      gdb = gdb.Debug()
      mock.ExpectBegin()
      mock.ExpectExec(rawSQLCreateUser).
        WithArgs(user.UserName,user.ID).WillReturnResult(sqlmock.NewResult(1, 1))
      mock.ExpectCommit()
      if err = CreateUser(gdb, user); err != nil {
        t.Errorf("gorm create fail, err=%v", err)
      }
      if err = mock.ExpectationsWereMet(); err != nil {
        t.Errorf("unexcept sql, err=%v", err)
      }
    }
    

    總結

    PS:筆者的老板對 sql 治理比較看重,所以在業務實現中會在存儲層對于每一個 sql 寫 sqlmock。

    sqlmock 雖然不能對整個業務功能進行集成測試,但是在 dao 層,對存儲數據的操作進行 sql 語句層面的校驗個人覺得是有必要的,一方面這會使 sql 的管理更加高效(將定義的 rawsql 單獨放在一個文件中),另一方面,數據庫層面改動時,有完整的 sql 校驗邏輯,方便 review 的人直觀的看出來具體數據有什么變化。

    順帶一提:這個庫的開源作者想要找個開源維護者,感興趣的也可以參與嘗試下。

    sql注入orm
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    前言SQL注入漏洞作為WEB安全的最常見的漏洞之一,在java中隨著預編譯與各種ORM框架的使用,注入問題也越來越少。Mybatis中SQL語句需要我們自己手動編寫或者用generator自動生成。編寫xml文件時,MyBatis支持兩種參數符號,一種是#,另一種是$。
    防范SQL注入的三個大招
    是否會校驗,在代碼變更的時候 sql 語句是否也發生了變更呢?針對以上兩個問題,sqlmock 可以完成對 sql 語句的單側,讓你對 orm 生成的 sql 了如指掌,同時清晰 test raw sql 也讓 review 的同事快樂加倍。
    在所有漏洞類型中,SQL 注入可是說是危害最大最受大家關注的漏洞。簡單說來,SQL 注入是通過在用戶可控參數中注入SQL語法,破壞原有SQL結構,達到編寫程序時意料之外結果的攻擊行為。還是以 ThinkJS 為例,假設我們寫了如下一個接口(實際情況肯定不會這么寫的):
    Django 數據庫函數 Trunc 和 Extract 主要用于進行日期操作,如果將未過濾的數據傳遞給 kind 或 lookup_name 時,將會產生 SQL 注入漏洞 CVE-2022-34265。
    sql注入已經出世很多年了,對于sql注入的概念和原理很多人應該是相當清楚了,SSTI也是注入類的漏洞,其成因其實是可以類比于sql注入的。BladeBlade 是 Laravel 提供的一個既簡單又強大的模板引擎。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
    業務邏輯漏洞挖掘
    2022-06-08 08:48:17
    一. 前言隨著各類前后端框架的成熟和完善,傳統的SQL注入、XSS等常規漏洞在Web系統里逐步減少,而攻擊者
    ThinkPHP可以支持windows/Unix/Linux等服務器環境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多種數據庫以及PDO擴展,是一款跨平臺,跨版本以及簡單易用的PHP框架。導致用戶的輸入參數被插入雙引號中執行,造成任意代碼執行漏洞ThinkPHP 3.0版本因為Lite模式下沒有修復該漏洞,也存在這個漏洞。preg_replace這個函數使用方法如下:preg_replace. 關于/e的解釋:e 配合函數preg_replace()使用, 可以把匹配來的字符串當作正則表達式執行;/e 可執行模式,此為PHP專有參數,例如preg_replace函數。
    ThinkPHP框架漏洞總結
    2023-05-18 15:25:22
    ThinkPHP可以支持windows/Unix/Linux等服務器環境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多種數據庫以及PDO擴展,是一款跨平臺,跨版本以及簡單易用的PHP框架。導致用戶的輸入參數被插入雙引號中執行,造成任意代碼執行漏洞ThinkPHP 3.0版本因為Lite模式下沒有修復該漏洞,也存在這個漏洞。preg_replace這個函數使用方法如下:preg_replace. 關于/e的解釋:e 配合函數preg_replace()使用, 可以把匹配來的字符串當作正則表達式執行;> #需要進行url編碼
    Thinkphp是一個國內輕量級的開發框架,采用php+apache,在更新迭代中,thinkphp也經常爆出各種漏洞,thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本,前兩個版本已經停止更新
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类