Removed guessing numeric type from a string.
This type of guess work is dangerous. It could lead to the situation where input is accepted from a query string for an primary key query, but is injected into the SQL string directly. /api/user/10 db.Find(&user, "10") // SELECT * FROM users WHERE id = 10; /api/user/1=1 db.Find(&user, "1=1") // SELECT * FROM users WHERE "1=1"; which is equivalent to // SELECT * FROM users It shouldn't behave differently based on the content of the string passed to it. Especially when that has a security implication. If the user want's to pass a int, they should pass that type.
This commit is contained in:
parent
d1fcba9bfc
commit
5ad24449bd
@ -17,10 +17,7 @@ func (scope *Scope) primaryCondition(value interface{}) string {
|
|||||||
func (scope *Scope) buildWhereCondition(clause map[string]interface{}) (str string) {
|
func (scope *Scope) buildWhereCondition(clause map[string]interface{}) (str string) {
|
||||||
switch value := clause["query"].(type) {
|
switch value := clause["query"].(type) {
|
||||||
case string:
|
case string:
|
||||||
// if string is number
|
if value != "" {
|
||||||
if regexp.MustCompile("^\\s*\\d+\\s*$").MatchString(value) {
|
|
||||||
return scope.primaryCondition(scope.AddToVars(value))
|
|
||||||
} else if value != "" {
|
|
||||||
str = fmt.Sprintf("(%v)", value)
|
str = fmt.Sprintf("(%v)", value)
|
||||||
}
|
}
|
||||||
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, sql.NullInt64:
|
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, sql.NullInt64:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user