<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>

    Go 類型轉換神器 cast庫

    VSole2022-08-02 10:48:20

    什么是 cast?

    cast 用于一致且簡單的方式在不同的 go 類型之間進行安全的轉換。

    為什么使用 cast? 

    在 Go 程序中,我們通常需要將數據由一種類型轉換為另一種類型。

    cast 使用一致且簡單的方式來提供安全的類型轉換。它不僅僅適用于類型斷言,更強大的功能在于我們使用接口來處理動態數據的時候,cast 提供了一種簡單的方法將接口優雅的轉換為我們需要的數據類型。

    使用 cast 將會極大的增加我們的開發效率,因為它本身就是為了開源項目 Hugo 而生。

    使用 Go 標準庫進行類型轉換的痛點 

    在實際開發中我們往往需要對一些常用的數據類型進行轉換,如 string,int,int64,float等數據類型。

    標準庫 strconv 提供了字符串與基本數據類型之間的轉換功能,我們也可以使用fmt.Sprintf函數進行轉換。

    但是往往使用起來不夠直觀,且當數據類型為接口時,若需要轉換成需要的數據類型較為繁瑣。

    快速使用 cast 

    安裝cast

    go get github.com/spf13/cast
    

    入門案例

    cast.ToString("gocn")            // "gocn"
    cast.ToString(8)                  // "8"
    cast.ToString(8.31)               // "8.31"
    cast.ToString([]byte("gocn"))    // "gocn"
    cast.ToString(nil)                // ""
    var foo interface{} = "I love gocn"
    cast.ToString(foo)                // "I love gocn"
    cast.ToInt(8)                  // 8
    cast.ToInt(8.31)               // 8
    cast.ToInt("8")                // 8
    cast.ToInt(true)               // 1
    cast.ToInt(false)              // 0
    var eight interface{} = 8
    cast.ToInt(eight)              // 8
    cast.ToInt(nil)                // 0
    

    cast 實現了多種常見類型之間的相互轉換,并返回最符合直覺的結果。如:

    • nil 轉 string 的結果為 ""
    • true 轉 string 的結果為 "true",true 轉 int 的結果為 1
    • interface{} 轉為其他類型,要看它里面存儲的值類型

    這些類型包括了:

    • 基本類型:整形,浮點型,布爾類型,字符串
    • 空接口:interface{}
    • nil
    • 時間:time.Time
    • 時間段:time.Duration
    • 切片類型:[]Type
    • map[string]Type

    使用起來非常的絲滑。

    進階使用

    cast提供了兩組函數:

    • toType,將參數轉換為 Type 類型。若轉換失敗,則返回 Type 類型的零值
    • ToTypeE,返回轉換后的值和 error

    時間和時間段的轉換

    代碼如下:

    package main
    import (
     "time"
     "github.com/spf13/cast"
    )
    func main() {
     timeStamp := time.Now().Unix()   //1617975806
     cast.ToTime(timeStamp)           //2021-04-09 21:43:26 +0800 CST
        
     timeStr := "2021-04-09 21:43:26"
     cast.ToTime(timeStr)       //2021-04-09 21:43:26 +0000 UTC
     duration, _ := time.ParseDuration("1m30s")
     cast.ToDuration(duration)         //1m30s
     strDuration := "90s"
     cast.ToDuration(strDuration)     //1m30s
    }
    

    轉換為切片

    代碼如下:

    package main
    import (
       "fmt"
       "github.com/spf13/cast"
    )
    func main() {
       sliceOfInt := []int{1, 3, 7}
       arrayOfInt := [3]int{8, 12}
       // ToIntSlice
       cast.ToIntSlice(sliceOfInt)  // [1 3 7]
       cast.ToIntSlice(arrayOfInt)  // [8 12 0]
       sliceOfInterface := []interface{}{1, 2.0, "gocn"}
       sliceOfString := []string{"I", "love", "gocn"}
       stringFields := " I   love  gocn   "
       any := interface{}(666)
       // ToStringSliceE
       cast.ToStringSlice(sliceOfInterface)  // [1 2 gocn]
       cast.ToStringSlice(sliceOfString)     // [I love gocn]
       cast.ToStringSlice(stringFields)      // [I love gocn]
       cast.ToStringSlice(any)               // [666]
    }
    

    轉為 map[string]Type

    代碼如下:

    package main
    import (
     "github.com/spf13/cast"
    )
    func main() {
     m := map[interface{}]interface{}{
      "name": "gocn",
      "age":  999,
     }
     cast.ToStringMapString(m)   //map[age:999 name:gocn]
        
     data := `{"name":"gocn", "url":"https://gocn.vip"}`
     cast.ToStringMapString(data)  //map[name:gocn url:https://gocn.vip]
    }
    

    總結 

    cast 庫能在幾乎所有常見類型之間轉換,小巧但是非常的實用。

    cast 提供一致且簡單的方式在各種常見的類型之間進行轉換,能極大的提高開發效率。

    類型轉換
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    cast 用于一致且簡單的方式在不同的 go 類型之間進行安全的轉換。在 Go 程序中,我們通常需要將數據由一種類型轉換為另一種類型。它不僅僅適用于類型斷言,更強大的功能在于我們使用接口來處理動態數據的時候,cast 提供了一種簡單的方法將接口優雅的轉換為我們需要的數據類型。
    S2-007的漏洞原理是在處理類型轉換的錯誤時會存入錯誤到內存中,在后續調用流程中觸發OGNL表達式注入。
    經PHP官方確認,于6月9日,PHP官網發布了該漏洞的修復方案。
    KCon 2021部分PPT發布
    2021-11-09 07:32:15
    今年是 KCon 10周年,疫情環境下線下會議舉步維艱,原本計劃在8月底進行的大會隨后推遲到10月底。考慮到未到場聽眾的急切心情,我們決定提前對外發布 KCon 議題。這次披露的是QEMU中比較罕見的可控長度越界讀寫漏洞,可以穩定利用并進行虛擬機逃逸,本次是首次披露該模塊的漏洞細節。本議題將介紹如何針對 CFI 的固有缺陷來突破其防御。
    作者:Randal E. Bryant,David R. O'Hallaron來源:華章計算機(hzbook
    7月20日,RedHat官方發布了Linux kernel本地權限提升漏洞的風險通告,漏洞CVE編號為CVE-2021-33909。目前Linux已發布安全版本修復該漏洞,建議受影響用戶及時升級到安全版本進行防護。
    2018年1月18日,國家信息安全漏洞共享平臺(CNVD)收錄了PHP GD Graphics Library存在拒絕服務漏洞(CNVD-2018-02505,對應CVE-2018-5711)。綜合利用上述漏洞,攻擊者可以構造惡意GIF文件,遠程利用PHP函數形成無限循環的方式發起拒絕服務攻擊。目前,漏洞利用代碼已公開,且廠商已發布漏洞修復版本。
    最后對響應的匹配,使用正則識別id命令之后的結果。成功掃描出CVE-2022-1388F5 BIG-IP API Unauthenticated RCE漏洞,漏洞的請求也變異無誤,最后的響應中也是執行了id命令。案例二:利用Scalpel工具挖掘多個0day漏洞Scalpel工具使用較為靈活,通過對檢測目標變異響應的check,可以發現檢測目標中未知的安全問題。同時發現某Apache開源項目的CVE漏洞,報告被該團隊接受并正在修復,尚未披露。
    EasyJaba 這個題目是隴原戰”疫”2021網絡安全大賽的一道題,最近正好在學習java反序列化和內存馬的相關知識,通過這個題目可以很好的進行實踐。 反序列化
    進程注入的探索
    2022-07-29 08:22:06
    0x01 簡單描述進程注入就是給一個正在運行的程序開辟一塊內存,把shellcode放入內存,然后用一個線程去執行shellcode。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类