@@ -7,9 +7,14 @@ private import python
7
7
private import semmle.python.dataflow.new.DataFlow
8
8
private import semmle.python.dataflow.new.TaintTracking
9
9
private import semmle.python.ApiGraphs
10
-
10
+ private import semmle.python.Concepts
11
11
12
12
private module SqlAlchemy {
13
+ /**
14
+ * An instantization of a SqlAlchemy Session object.
15
+ * See https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session and
16
+ * https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.sessionmaker
17
+ */
13
18
private class SqlAlchemySessionInstance extends API:: Node {
14
19
SqlAlchemySessionInstance ( ) {
15
20
this in [
@@ -18,26 +23,40 @@ private module SqlAlchemy {
18
23
]
19
24
}
20
25
21
- override string toString ( ) { result = "Use of SqlAlchemy Session instance method " }
26
+ override string toString ( ) { result = "Use of SqlAlchemy Session instantization " }
22
27
}
23
28
29
+ /**
30
+ * An instantization of a SqlAlchemy Engine object.
31
+ * See https://docs.sqlalchemy.org/en/14/core/engines.html#sqlalchemy.create_engine
32
+ */
24
33
private class SqlAlchemyEngineInstance extends API:: Node {
25
34
SqlAlchemyEngineInstance ( ) {
26
35
this = API:: moduleImport ( "sqlalchemy" ) .getMember ( "create_engine" ) .getReturn ( )
27
36
}
28
37
29
- override string toString ( ) { result = "Use of SqlAlchemy Engine instance method " }
38
+ override string toString ( ) { result = "Use of SqlAlchemy create_engine member " }
30
39
}
31
40
41
+ /**
42
+ * An instantization of a SqlAlchemy Query object.
43
+ * See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
44
+ */
32
45
private class SqlAlchemyQueryInstance extends API:: Node {
33
46
SqlAlchemyQueryInstance ( ) {
34
- this instanceof SqlAlchemySessionInstance and
35
- this = this .getMember ( "query" ) .getReturn ( )
47
+ this = any ( SqlAlchemySessionInstance sessionInstance ) .getMember ( "query" ) .getReturn ( )
36
48
}
37
49
38
- override string toString ( ) { result = "Use of SqlAlchemy Query instance method " }
50
+ override string toString ( ) { result = "Use of SqlAlchemy Session Query member " }
39
51
}
40
52
53
+ /**
54
+ * A call to `execute` meant to execute an SQL expression
55
+ * See the following links:
56
+ * - https://docs.sqlalchemy.org/en/14/core/connections.html?highlight=execute#sqlalchemy.engine.Connection.execute
57
+ * - https://docs.sqlalchemy.org/en/14/core/connections.html?highlight=execute#sqlalchemy.engine.Engine.execute
58
+ * - https://docs.sqlalchemy.org/en/14/orm/session_api.html?highlight=execute#sqlalchemy.orm.Session.execute
59
+ */
41
60
private class SqlAlchemyExecuteCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
42
61
SqlAlchemyExecuteCall ( ) {
43
62
exists ( SqlAlchemySessionInstance sessionInstance , SqlAlchemyEngineInstance engineInstance |
@@ -50,19 +69,27 @@ private module SqlAlchemy {
50
69
override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
51
70
}
52
71
72
+ /**
73
+ * A call to `scalar` meant to execute an SQL expression
74
+ * See https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session.scalar and
75
+ * https://docs.sqlalchemy.org/en/14/core/connections.html?highlight=scalar#sqlalchemy.engine.Engine.scalar
76
+ */
53
77
private class SqlAlchemyScalarCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
54
78
SqlAlchemyScalarCall ( ) {
55
- exists ( SqlAlchemySessionInstance sessionInstance |
56
- this = sessionInstance .getMember ( "scalar" ) .getACall ( )
57
- )
79
+ this = any ( SqlAlchemySessionInstance sessionInstance ) .getMember ( "scalar" ) .getACall ( ) or
80
+ this = any ( SqlAlchemyEngineInstance engineInstance ) .getMember ( "scalar" ) .getACall ( )
58
81
}
59
82
60
83
override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
61
84
}
62
85
86
+ /**
87
+ * A call on a Query object
88
+ * See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
89
+ */
63
90
private class SqlAlchemyQueryCall extends DataFlow:: CallCfgNode , SqlExecution:: Range {
64
91
SqlAlchemyQueryCall ( ) {
65
- exists ( SqlAlchemyQueryInstance queryInstance | this = queryInstance .getAMember ( ) .getACall ( ) )
92
+ this = any ( SqlAlchemyQueryInstance queryInstance ) .getAMember ( ) .getACall ( )
66
93
}
67
94
68
95
override DataFlow:: Node getSql ( ) { result = this .getArg ( 0 ) }
0 commit comments