這是我的代碼: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...)
- 1 回答
- 0 關注
- 133 瀏覽
添加回答
舉報
0/150
提交
取消