Repository navigation
Expand file tree
/
Copy pathStringConcatQueryHandler.java
More file actions
55 lines (46 loc) · 1.69 KB
/
Copy pathStringConcatQueryHandler.java
File metadata and controls
55 lines (46 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.example;
import org.springframework.r2dbc.core.DatabaseClient;
/**
* Test source for `DatabaseClient.sql(String)`: request-derived values are
* concatenated into a SQL string via a `StringBuilder`, then executed
* directly.
*/
public class StringConcatQueryHandler {
// Fake remote flow source, recognized by DatabaseClientSqlInjection.ql.
public static String source() {
return null;
}
private final DatabaseClient databaseClient;
public StringConcatQueryHandler(DatabaseClient databaseClient) {
this.databaseClient = databaseClient;
}
private void appendFilters(StringBuilder sql, String category, String sortBy, String sortOrder) {
if (category != null) {
sql.append(" AND category = '").append(category).append("'");
}
if (sortBy != null && sortOrder != null) {
sql.append(" ORDER BY ").append(sortBy).append(" ").append(sortOrder);
}
}
private String buildQuery(String category, String sortBy, String sortOrder) {
StringBuilder sql = new StringBuilder("SELECT * FROM items WHERE 1=1");
appendFilters(sql, category, sortBy, sortOrder);
return sql.toString();
}
public Object runQuery() {
String category = source();
String sortBy = source();
String sortOrder = source();
String query = buildQuery(category, sortBy, sortOrder);
return databaseClient.sql(query).fetch().all(); // sink 1: sql(String)
}
public Object runQuerySafe() {
// Parameter binding, not string concatenation - should NOT be flagged.
String category = source();
return databaseClient
.sql("SELECT * FROM items WHERE category = :category")
.bind("category", category)
.fetch()
.all();
}
}