@@ -44,8 +44,8 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err
44
44
45
45
// construct queries (with extra variants)
46
46
let const_string = String :: from ( "Alice" ) ;
47
- let arg_string = std:: env:: args ( ) . nth ( 1 ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING Source=args1
48
- let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING Source=remote1
47
+ let arg_string = std:: env:: args ( ) . nth ( 1 ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING: Source=args1
48
+ let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING: Source=remote1
49
49
let remote_number = remote_string. parse :: < i32 > ( ) . unwrap_or ( 0 ) ;
50
50
let safe_query_1 = String :: from ( "SELECT * FROM people WHERE firstname='Alice'" ) ;
51
51
let safe_query_2 = String :: from ( "SELECT * FROM people WHERE firstname='" ) + & const_string + "'" ;
@@ -57,31 +57,31 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err
57
57
let prepared_query_1 = String :: from ( "SELECT * FROM people WHERE firstname=?" ) ; // (prepared arguments are safe)
58
58
59
59
// direct execution
60
- let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?;
61
- let _ = conn. execute ( safe_query_2. as_str ( ) ) . await ?;
62
- let _ = conn. execute ( safe_query_3. as_str ( ) ) . await ?;
63
- let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=args1
60
+ let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?; // $ sql-sink
61
+ let _ = conn. execute ( safe_query_2. as_str ( ) ) . await ?; // $ sql-sink
62
+ let _ = conn. execute ( safe_query_3. as_str ( ) ) . await ?; // $ sql-sink
63
+ let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=args1
64
64
if enable_remote {
65
- let _ = conn. execute ( unsafe_query_2. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=remote1
66
- let _ = conn. execute ( unsafe_query_3. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=remote1
67
- let _ = conn. execute ( unsafe_query_4. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=remote1
65
+ let _ = conn. execute ( unsafe_query_2. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
66
+ let _ = conn. execute ( unsafe_query_3. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
67
+ let _ = conn. execute ( unsafe_query_4. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
68
68
}
69
69
70
70
// prepared queries
71
- let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & pool) . await ?;
72
- let _ = sqlx:: query ( safe_query_2. as_str ( ) ) . execute ( & pool) . await ?;
73
- let _ = sqlx:: query ( safe_query_3. as_str ( ) ) . execute ( & pool) . await ?;
74
- let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ MISSING Alert[sql-injection]=args1
71
+ let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink
72
+ let _ = sqlx:: query ( safe_query_2. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink
73
+ let _ = sqlx:: query ( safe_query_3. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink
74
+ let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=args1
75
75
if enable_remote {
76
- let _ = sqlx:: query ( unsafe_query_2. as_str ( ) ) . execute ( & pool) . await ?; // $ MISSING Alert[sql-injection]=remote1
77
- let _ = sqlx:: query ( unsafe_query_3. as_str ( ) ) . execute ( & pool) . await ?; // $ MISSING Alert[sql-injection]=remote1
78
- let _ = sqlx:: query ( unsafe_query_4. as_str ( ) ) . execute ( & pool) . await ?; // $ MISSING Alert[sql-injection]=remote1
76
+ let _ = sqlx:: query ( unsafe_query_2. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
77
+ let _ = sqlx:: query ( unsafe_query_3. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
78
+ let _ = sqlx:: query ( unsafe_query_4. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote1
79
79
}
80
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( const_string) . execute ( & pool) . await ?;
81
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( arg_string) . execute ( & pool) . await ?;
80
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( const_string) . execute ( & pool) . await ?; // $ sql-sink
81
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( arg_string) . execute ( & pool) . await ?; // $ sql-sink
82
82
if enable_remote {
83
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( remote_string) . execute ( & pool) . await ?;
84
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( remote_number) . execute ( & pool) . await ?;
83
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( remote_string) . execute ( & pool) . await ?; // $ sql-sink
84
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( remote_number) . execute ( & pool) . await ?; // $ sql-sink
85
85
}
86
86
87
87
Ok ( ( ) )
@@ -93,67 +93,67 @@ async fn test_sqlx_sqlite(url: &str, enable_remote: bool) -> Result<(), sqlx::Er
93
93
94
94
// construct queries
95
95
let const_string = String :: from ( "Alice" ) ;
96
- let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING Source=remote2
96
+ let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING: Source=remote2
97
97
let safe_query_1 = String :: from ( "SELECT * FROM people WHERE firstname='" ) + & const_string + "'" ;
98
98
let unsafe_query_1 = String :: from ( "SELECT * FROM people WHERE firstname='" ) + & remote_string + "'" ;
99
99
let prepared_query_1 = String :: from ( "SELECT * FROM people WHERE firstname=?" ) ; // (prepared arguments are safe)
100
100
101
101
// direct execution (with extra variants)
102
- let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?;
102
+ let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?; // $ sql-sink
103
103
if enable_remote {
104
- let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=remote2
104
+ let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote2
105
105
}
106
106
// ...
107
- let _ = sqlx:: raw_sql ( safe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?;
107
+ let _ = sqlx:: raw_sql ( safe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ sql-sink
108
108
if enable_remote {
109
- let _ = sqlx:: raw_sql ( unsafe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ MISSING Alert[sql-injection]=remote2
109
+ let _ = sqlx:: raw_sql ( unsafe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote2
110
110
}
111
111
112
112
// prepared queries (with extra variants)
113
- let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?;
114
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . execute ( & mut conn) . await ?;
113
+ let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ sql-sink
114
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . execute ( & mut conn) . await ?; // $ sql-sink
115
115
if enable_remote {
116
- let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ MISSING Alert[sql-injection]=remote2
117
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . execute ( & mut conn) . await ?;
116
+ let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & mut conn) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote2
117
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . execute ( & mut conn) . await ?; // $ sql-sink
118
118
}
119
119
// ...
120
- let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . fetch ( & mut conn) ;
121
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch ( & mut conn) ;
120
+ let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . fetch ( & mut conn) ; // $ sql-sink
121
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch ( & mut conn) ; // $ sql-sink
122
122
if enable_remote {
123
- let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . fetch ( & mut conn) ; // $ MISSING Alert[sql-injection]=remote2
124
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch ( & mut conn) ;
123
+ let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . fetch ( & mut conn) ; // $ sql-sink MISSING: Alert[sql-injection]=remote2
124
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch ( & mut conn) ; // $ sql-sink
125
125
}
126
126
// ...
127
- let row1: ( i64 , String , String ) = sqlx:: query_as ( safe_query_1. as_str ( ) ) . fetch_one ( & mut conn) . await ?;
127
+ let row1: ( i64 , String , String ) = sqlx:: query_as ( safe_query_1. as_str ( ) ) . fetch_one ( & mut conn) . await ?; // $ sql-sink
128
128
println ! ( " row1 = {:?}" , row1) ;
129
- let row2: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_one ( & mut conn) . await ?;
129
+ let row2: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_one ( & mut conn) . await ?; // $ sql-sink
130
130
println ! ( " row2 = {:?}" , row2) ;
131
131
if enable_remote {
132
- let _: ( i64 , String , String ) = sqlx:: query_as ( unsafe_query_1. as_str ( ) ) . fetch_one ( & mut conn) . await ?; // $ MISSING Alert[sql-injection]=remote2
133
- let _: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_one ( & mut conn) . await ?;
132
+ let _: ( i64 , String , String ) = sqlx:: query_as ( unsafe_query_1. as_str ( ) ) . fetch_one ( & mut conn) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote2
133
+ let _: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_one ( & mut conn) . await ?; // $ sql-sink
134
134
}
135
135
// ...
136
- let row3: ( i64 , String , String ) = sqlx:: query_as ( safe_query_1. as_str ( ) ) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ;
136
+ let row3: ( i64 , String , String ) = sqlx:: query_as ( safe_query_1. as_str ( ) ) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ; // $ sql-sink
137
137
println ! ( " row3 = {:?}" , row3) ;
138
- let row4: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ;
138
+ let row4: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ; // $ sql-sink
139
139
println ! ( " row4 = {:?}" , row4) ;
140
140
if enable_remote {
141
- let _: ( i64 , String , String ) = sqlx:: query_as ( unsafe_query_1. as_str ( ) ) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ; // $ MISSING Alert[sql-injection]=remote2
142
- let _: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ;
141
+ let _: ( i64 , String , String ) = sqlx:: query_as ( unsafe_query_1. as_str ( ) ) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ; // $ sql-sink $ MISSING: Alert[sql-injection]=remote2
142
+ let _: ( i64 , String , String ) = sqlx:: query_as ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_optional ( & mut conn) . await ?. expect ( "no data" ) ; // $ sql-sink
143
143
}
144
144
// ...
145
- let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . fetch_all ( & mut conn) . await ?;
146
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_all ( & mut conn) . await ?;
147
- let _ = sqlx:: query ( "SELECT * FROM people WHERE firstname=?" ) . bind ( & const_string) . fetch_all ( & mut conn) . await ?;
145
+ let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . fetch_all ( & mut conn) . await ?; // $ sql-sink
146
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . fetch_all ( & mut conn) . await ?; // $ sql-sink
147
+ let _ = sqlx:: query ( "SELECT * FROM people WHERE firstname=?" ) . bind ( & const_string) . fetch_all ( & mut conn) . await ?; // $ sql-sink
148
148
if enable_remote {
149
- let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . fetch_all ( & mut conn) . await ?; // $ MISSING Alert[sql-injection]=remote2
150
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_all ( & mut conn) . await ?;
151
- let _ = sqlx:: query ( "SELECT * FROM people WHERE firstname=?" ) . bind ( & remote_string) . fetch_all ( & mut conn) . await ?;
149
+ let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . fetch_all ( & mut conn) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote2
150
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . fetch_all ( & mut conn) . await ?; // $ sql-sink
151
+ let _ = sqlx:: query ( "SELECT * FROM people WHERE firstname=?" ) . bind ( & remote_string) . fetch_all ( & mut conn) . await ?; // $ sql-sink
152
152
}
153
153
// ...
154
- let _ = sqlx:: query!( "SELECT * FROM people WHERE firstname=$1" , const_string) . fetch_all ( & mut conn) . await ?; // (only takes string literals, so can't be vulnerable)
154
+ let _ = sqlx:: query!( "SELECT * FROM people WHERE firstname=$1" , const_string) . fetch_all ( & mut conn) . await ?; // $ MISSING: sql-sink (only takes string literals, so can't be vulnerable)
155
155
if enable_remote {
156
- let _ = sqlx:: query!( "SELECT * FROM people WHERE firstname=$1" , remote_string) . fetch_all ( & mut conn) . await ?;
156
+ let _ = sqlx:: query!( "SELECT * FROM people WHERE firstname=$1" , remote_string) . fetch_all ( & mut conn) . await ?; // $ MISSING: sql-sink
157
157
}
158
158
159
159
Ok ( ( ) )
@@ -166,23 +166,23 @@ async fn test_sqlx_postgres(url: &str, enable_remote: bool) -> Result<(), sqlx::
166
166
167
167
// construct queries
168
168
let const_string = String :: from ( "Alice" ) ;
169
- let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING Source=remote3
169
+ let remote_string = reqwest:: blocking:: get ( "http://example.com/" ) . unwrap ( ) . text ( ) . unwrap_or ( String :: from ( "Alice" ) ) ; // $ MISSING: Source=remote3
170
170
let safe_query_1 = String :: from ( "SELECT * FROM people WHERE firstname='" ) + & const_string + "'" ;
171
171
let unsafe_query_1 = String :: from ( "SELECT * FROM people WHERE firstname='" ) + & remote_string + "'" ;
172
172
let prepared_query_1 = String :: from ( "SELECT * FROM people WHERE firstname=$1" ) ; // (prepared arguments are safe)
173
173
174
174
// direct execution
175
- let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?;
175
+ let _ = conn. execute ( safe_query_1. as_str ( ) ) . await ?; // $ sql-sink
176
176
if enable_remote {
177
- let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ MISSING Alert[sql-injection]=remote3
177
+ let _ = conn. execute ( unsafe_query_1. as_str ( ) ) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote3
178
178
}
179
179
180
180
// prepared queries
181
- let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & pool) . await ?;
182
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . execute ( & pool) . await ?;
181
+ let _ = sqlx:: query ( safe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink
182
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & const_string) . execute ( & pool) . await ?; // $ sql-sink
183
183
if enable_remote {
184
- let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ MISSING Alert[sql-injection]=remote3
185
- let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . execute ( & pool) . await ?;
184
+ let _ = sqlx:: query ( unsafe_query_1. as_str ( ) ) . execute ( & pool) . await ?; // $ sql-sink MISSING: Alert[sql-injection]=remote3
185
+ let _ = sqlx:: query ( prepared_query_1. as_str ( ) ) . bind ( & remote_string) . execute ( & pool) . await ?; // $ sql-sink
186
186
}
187
187
188
188
Ok ( ( ) )
0 commit comments