diff --git a/ql/src/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/ql/src/semmle/go/dataflow/internal/TaintTrackingUtil.qll index db7b3c23b18..4627bbf3159 100644 --- a/ql/src/semmle/go/dataflow/internal/TaintTrackingUtil.qll +++ b/ql/src/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -200,3 +200,26 @@ abstract class DefaultTaintSanitizerGuard extends DataFlow::BarrierGuard { } predicate isDefaultTaintSanitizerGuard(DataFlow::BarrierGuard guard) { guard instanceof DefaultTaintSanitizerGuard } + +/** + * An equality test acting as a sanitizer guard for `nonConstNode` by + * restricting it to a known value. + * + * Note that comparisons to `nil` are excluded. This is needed for performance + * reasons. + */ +class EqualityTestGuard extends DefaultTaintSanitizerGuard, DataFlow::EqualityTestNode { + DataFlow::Node nonConstNode; + + EqualityTestGuard() { + this.getAnOperand().isConst() and + nonConstNode = this.getAnOperand() and + not nonConstNode.isConst() and + not this.getAnOperand() = Builtin::nil().getARead() + } + + override predicate checks(Expr e, boolean outcome) { + e = nonConstNode.asExpr() and + outcome = this.getPolarity() + } +} diff --git a/ql/src/semmle/go/security/Xss.qll b/ql/src/semmle/go/security/Xss.qll index 4b32697c59b..b438cdfd4f1 100644 --- a/ql/src/semmle/go/security/Xss.qll +++ b/ql/src/semmle/go/security/Xss.qll @@ -103,15 +103,4 @@ module SharedXss { ) } } - - /** - * A check against a constant value, considered a barrier for XSS. - */ - class EqualityTestGuard extends SanitizerGuard, DataFlow::EqualityTestNode { - override predicate checks(Expr e, boolean outcome) { - this.getAnOperand().isConst() and - e = this.getAnOperand().asExpr() and - outcome = this.getPolarity() - } - } }