I am writing a dynamic query and executing it using go-gorm's db.Raw() function. I want to prevent SQL Injection attacks on the query I have build.
I am writing this query to get all users with server side pagination, search and filter. My query is working very perfect but it has a threat of SQL Injection attack.
// 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
}
I have done this many times in my project. So, I am finding a way to correct this without changing the query but using any third party library to correct this. ( like we do in nodejs using sql-escape-string package available at npm)