亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使查詢構建器安全并防止sql注入

如何使查詢構建器安全并防止sql注入

Go
慕哥6287543 2022-10-04 19:44:24
這是我的代碼:type mysqlRepository struct {    Conn *sql.DB}func (dbconn *mysqlRepository) GetAll(param map[string]string) (response []models.Subject, err error) {    var result models.Subject    c := 0    q := `        SELECT id, name, teacher, uuid        FROM subject    `    for i, x := range param {        if x != "" {            if c > 0 {                q += ` AND ` + i + ` = ` + x            } else {                q += ` WHERE ` + i + ` = ` + x            }            c++        }    }    query, err := dbconn.Conn.Query(q)    if err != nil {        utils.QueryErrorException(err)        return    }    defer query.Close()    for query.Next() {        errorScanningDataHistory := query.Scan(            &result.ID,            &result.Name,            &result.Teacher,            &result.UUID,        )        utils.QueryErrorException(errorScanningDataHistory)        response = append(response, result)    }    return}我嘗試像這樣使用郵遞員并運行良好:http://localhost/public/api/v1/subject?name=robert。它只顯示羅伯特作為老師的主題但是,如果我注入sql命令,它也可以工作:http://localhost/public/api/v1/subject?name=robert OR 1 = 1。但是,它返回所有數據。如何提高安全性?
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

實施@mkopriva的評論


通過已知/允許列的映射篩選 i。不要連接 x,而是使用占位符 ?并將 x 附加到參數片中,然后將其傳遞給查詢


    safeFields := map[string]bool{"name": true}

    args := []interface{}{}

    where := "WHERE 1"

    for i, x := range param {

        if _, ok := safeFields[i]; ok && x != "" {

            where += fmt.Sprintf(" AND %s=?", i)

            args = append(args, x)

        }

    }


    query, err := dbconn.Conn.Query(q+where, args...)


查看完整回答
反對 回復 2022-10-04
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號