aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/securego/gosec/v2/rules/sql.go
diff options
context:
space:
mode:
authordependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>2023-08-22 02:02:22 +0000
committerTaras Madan <tarasmadan@google.com>2023-08-22 12:20:16 +0000
commit91132985a7ff76db390949ac765113cfd3178fa7 (patch)
tree9dcdece9df519c487f06e1b7a824c7ddd571ce53 /vendor/github.com/securego/gosec/v2/rules/sql.go
parent81191e0ae93e179f148ee4f89deedfe444d7baaa (diff)
mod: do: bump github.com/golangci/golangci-lint from 1.54.1 to 1.54.2
Bumps [github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint) from 1.54.1 to 1.54.2. - [Release notes](https://github.com/golangci/golangci-lint/releases) - [Changelog](https://github.com/golangci/golangci-lint/blob/master/CHANGELOG.md) - [Commits](https://github.com/golangci/golangci-lint/compare/v1.54.1...v1.54.2) --- updated-dependencies: - dependency-name: github.com/golangci/golangci-lint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
Diffstat (limited to 'vendor/github.com/securego/gosec/v2/rules/sql.go')
-rw-r--r--vendor/github.com/securego/gosec/v2/rules/sql.go51
1 files changed, 50 insertions, 1 deletions
diff --git a/vendor/github.com/securego/gosec/v2/rules/sql.go b/vendor/github.com/securego/gosec/v2/rules/sql.go
index 4085b5d26..61222bfdb 100644
--- a/vendor/github.com/securego/gosec/v2/rules/sql.go
+++ b/vendor/github.com/securego/gosec/v2/rules/sql.go
@@ -98,6 +98,32 @@ func (s *sqlStrConcat) ID() string {
return s.MetaData.ID
}
+// findInjectionInBranch walks diwb a set if expressions, and will create new issues if it finds SQL injections
+// This method assumes you've already verified that the branch contains SQL syntax
+func (s *sqlStrConcat) findInjectionInBranch(ctx *gosec.Context, branch []ast.Expr) *ast.BinaryExpr {
+ for _, node := range branch {
+ be, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ continue
+ }
+
+ operands := gosec.GetBinaryExprOperands(be)
+
+ for _, op := range operands {
+ if _, ok := op.(*ast.BasicLit); ok {
+ continue
+ }
+
+ if ident, ok := op.(*ast.Ident); ok && s.checkObject(ident, ctx) {
+ continue
+ }
+
+ return be
+ }
+ }
+ return nil
+}
+
// see if we can figure out what it is
func (s *sqlStrConcat) checkObject(n *ast.Ident, c *gosec.Context) bool {
if n.Obj != nil {
@@ -140,6 +166,28 @@ func (s *sqlStrConcat) checkQuery(call *ast.CallExpr, ctx *gosec.Context) (*issu
}
}
+ // Handle the case where an injection occurs as an infixed string concatenation, ie "SELECT * FROM foo WHERE name = '" + os.Args[0] + "' AND 1=1"
+ if id, ok := query.(*ast.Ident); ok {
+ var match bool
+ for _, str := range gosec.GetIdentStringValuesRecursive(id) {
+ if s.MatchPatterns(str) {
+ match = true
+ break
+ }
+ }
+
+ if !match {
+ return nil, nil
+ }
+
+ switch decl := id.Obj.Decl.(type) {
+ case *ast.AssignStmt:
+ if injection := s.findInjectionInBranch(ctx, decl.Rhs); injection != nil {
+ return ctx.NewIssue(injection, s.ID(), s.What, s.Severity, s.Confidence), nil
+ }
+ }
+ }
+
return nil, nil
}
@@ -157,6 +205,7 @@ func (s *sqlStrConcat) Match(n ast.Node, ctx *gosec.Context) (*issue.Issue, erro
return s.checkQuery(sqlQueryCall, ctx)
}
}
+
return nil, nil
}
@@ -165,7 +214,7 @@ func NewSQLStrConcat(id string, _ gosec.Config) (gosec.Rule, []ast.Node) {
rule := &sqlStrConcat{
sqlStatement: sqlStatement{
patterns: []*regexp.Regexp{
- regexp.MustCompile(`(?i)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) `),
+ regexp.MustCompile("(?i)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE)( |\n|\r|\t)"),
},
MetaData: issue.MetaData{
ID: id,