Skip to content

Commit 3a316f1

Browse files
committed
C#: Re-factor SqlInjection to use the new API.
1 parent 60a0917 commit 3a316f1

File tree

3 files changed

+44
-10
lines changed

3 files changed

+44
-10
lines changed

csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ abstract class Sink extends DataFlow::ExprNode { }
2525
abstract class Sanitizer extends DataFlow::ExprNode { }
2626

2727
/**
28+
* DEPRECATED: Use `SqlInjection` instead.
29+
*
2830
* A taint-tracking configuration for SQL injection vulnerabilities.
2931
*/
30-
class TaintTrackingConfiguration extends TaintTracking::Configuration {
32+
deprecated class TaintTrackingConfiguration extends TaintTracking::Configuration {
3133
TaintTrackingConfiguration() { this = "SqlInjection" }
3234

3335
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -37,6 +39,32 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration {
3739
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
3840
}
3941

42+
/**
43+
* A taint-tracking configuration for SQL injection vulnerabilities.
44+
*/
45+
module SqlInjectionConfig implements DataFlow::ConfigSig {
46+
/**
47+
* Holds if `source` is a relevant data flow source.
48+
*/
49+
predicate isSource(DataFlow::Node source) { source instanceof Source }
50+
51+
/**
52+
* Holds if `sink` is a relevant data flow sink.
53+
*/
54+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
55+
56+
/**
57+
* Holds if data flow through `node` is prohibited. This completely removes
58+
* `node` from the data flow graph.
59+
*/
60+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
61+
}
62+
63+
/**
64+
* A taint-tracking module for SQL injection vulnerabilities.
65+
*/
66+
module SqlInjection = TaintTracking::Global<SqlInjectionConfig>;
67+
4068
/** A source of remote user input. */
4169
class RemoteSource extends Source instanceof RemoteFlowSource { }
4270

csharp/ql/src/Security Features/CWE-089/SecondOrderSqlInjection.ql

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@
1212
*/
1313

1414
import csharp
15-
import semmle.code.csharp.security.dataflow.SqlInjectionQuery as SqlInjection
15+
import semmle.code.csharp.security.dataflow.SqlInjectionQuery
1616
import semmle.code.csharp.security.dataflow.flowsources.Stored
17-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
17+
import StoredSqlInjection::PathGraph
1818

19-
class StoredTaintTrackingConfiguration extends SqlInjection::TaintTrackingConfiguration {
20-
override predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource }
19+
module StoredSqlInjectionConfig implements DataFlow::ConfigSig {
20+
predicate isSource(DataFlow::Node source) { source instanceof StoredFlowSource }
21+
22+
predicate isSink = SqlInjectionConfig::isSink/1;
23+
24+
predicate isBarrier = SqlInjectionConfig::isBarrier/1;
2125
}
2226

23-
from StoredTaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
24-
where c.hasFlowPath(source, sink)
27+
module StoredSqlInjection = TaintTracking::Global<StoredSqlInjectionConfig>;
28+
29+
from StoredSqlInjection::PathNode source, StoredSqlInjection::PathNode sink
30+
where StoredSqlInjection::flowPath(source, sink)
2531
select sink.getNode(), source, sink, "This SQL query depends on a $@.", source.getNode(),
2632
"stored user-provided value"

csharp/ql/src/Security Features/CWE-089/SqlInjection.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
import csharp
1515
import semmle.code.csharp.security.dataflow.SqlInjectionQuery
16-
import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph
16+
import SqlInjection::PathGraph
1717
import semmle.code.csharp.security.dataflow.flowsources.Remote
1818
import semmle.code.csharp.security.dataflow.flowsources.Local
1919

@@ -23,7 +23,7 @@ string getSourceType(DataFlow::Node node) {
2323
result = node.(LocalFlowSource).getSourceType()
2424
}
2525

26-
from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink
27-
where c.hasFlowPath(source, sink)
26+
from SqlInjection::PathNode source, SqlInjection::PathNode sink
27+
where SqlInjection::flowPath(source, sink)
2828
select sink.getNode(), source, sink, "This query depends on $@.", source,
2929
("this " + getSourceType(source.getNode()))

0 commit comments

Comments
 (0)