gpt4 book ai didi

go - 与 go-gorm 框架一起使用的动态查询

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:29 26 4
gpt4 key购买 nike

我正在编写动态查询并使用 go-gorm 的 db.Raw() 函数执行它。我想防止对我构建的查询进行 SQL 注入(inject)攻击。

我正在编写此查询以获取所有具有服务器端分页、搜索和筛选功能的用户。我的查询运行得非常完美,但它存在 SQL 注入(inject)攻击的威胁。

// GetUserGridDataWithPagination - gets data to show in users grid to admin with pagination
func (controller Admin) GetUserGridDataWithPagination(
filterBy string,
searchBy string,
sortBy string,
sortOrder string,
pageSize uint16,
pageNumber uint16,
) ([]model.AdminUserGridData, int64, uint16, error) {
var list []model.AdminUserGridData
query := `SELECT * FROM users_master`
query1 := `SELECT count(*) FROM users_master`
clause := ` WHERE `
filterCondition := ""
searchCondition := ""
sortCondition := ""
if filterBy != "all" {
filterCondition = ` WHERE role = '` + filterBy + `'`
clause = ` AND `
}
if searchBy != "" {
search := "'%" + searchBy + "%'"
searchCondition = clause +
`name ilike ` + search + ` OR
email ilike ` + search + ` OR
phone ilike ` + search + ` OR
profession ilike ` + search + ` OR
role ilike ` + search + ` OR
kyc_status ilike ` + search
}
if sortBy != "" {
column := ""
if sortBy == "kycStatus" {
column = "kyc_status"
} else {
column = sortBy
}
if sortOrder != "" {
sortCondition = ` ORDER BY ` + column + ` ` + sortOrder
}
}
if filterCondition != "" {
query = query + filterCondition
query1 = query1 + filterCondition
}
if searchCondition != "" {
query = query + searchCondition
query1 = query1 + searchCondition
}
if sortCondition != "" {
query = query + sortCondition
}
query = query + ` LIMIT ? OFFSET ?`
// fetch records from database
if err := controller.database.Raw(query, pageSize, (pageSize * (pageNumber - 1))).Scan(&list).Error; err != nil {
log.Error(err)
return nil, 0, 0, errors.New("Error while processing your request")
}
// fetch total no of records from database
type RowCount struct {
Count int64 `json:"count"`
}
var rowCount RowCount
if err := controller.database.Raw(query1).Scan(&rowCount).Error; err != nil {
log.Error(err)
return nil, 0, 0, errors.New("Error while processing
your request")
}
return list, rowCount.Count, pageNumber, nil
}

我在我的项目中已经做过很多次了。因此,我正在寻找一种方法来更正此问题而不更改查询但使用任何第三方库来更正此问题。 (就像我们在 nodejs 中使用 sql-escape-string包在 npm 上可用)

最佳答案

您应该使用 gorm 查询生成器并在 args 中传递参数:哪里(查询接口(interface){},args ...接口(interface){})*DB。就足够了。由于像上面这样的 gorm 方法正在改变您正在构建的 SQL 查询的内部状态,因此可以编写如下代码:

var usersMasterList []UsersMaster // gorm Model
if filterBy != "all" {
controller.database.Where("role = ?", filterBy)
}
if searchBy != "" {
controller.database.Or("name ilike ?", search)
controller.database.Or("email ilike ?", search)
//...
}
//...
controller.database.Find(&usersMasterList)

代码未经测试。您可以在此处阅读更多信息:http://gorm.io/docs/query.html

或者您可以使用正则表达式从这些字符串中过滤非字母数字字符:

rx := regexp.MustCompile("[^a-zA-Z0-9]+")
yourString = rx.ReplaceAllString(yourString, "")

强烈建议尽快重写您的代码,代码将更加安全和可读。

关于go - 与 go-gorm 框架一起使用的动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54230287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com