Skip to content

Commit 882f436

Browse files
authored
Adds new transformation for SQL injection/parameterization codemods (#463)
Also adjusts the add statements method to work around some `LexicalPreservingPrinter` issues. This fixed some spacing, indentation issues in some tests.
1 parent d1bfcc9 commit 882f436

File tree

17 files changed

+400
-181
lines changed

17 files changed

+400
-181
lines changed

core-codemods/src/test/java/io/codemodder/codemods/MoveSwitchDefaultCaseLastCodemodTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ void foo() {
5757
break;
5858
default:
5959
break;
60-
case 0:
61-
break;
62-
}
60+
case 0:
61+
break;
62+
}
6363
}
6464
}
6565
""";

core-codemods/src/test/java/io/codemodder/codemods/SQLParameterizerCodemodTest.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,21 @@
22

33
import io.codemodder.testutils.CodemodTestMixin;
44
import io.codemodder.testutils.Metadata;
5+
import org.junit.jupiter.api.Nested;
56

6-
@Metadata(
7-
codemodType = SQLParameterizerCodemod.class,
8-
testResourceDir = "sql-parameterizer",
9-
dependencies = {})
10-
final class SQLParameterizerCodemodTest implements CodemodTestMixin {}
7+
final class SQLParameterizerCodemodTest {
8+
9+
@Nested
10+
@Metadata(
11+
codemodType = SQLParameterizerCodemod.class,
12+
testResourceDir = "sql-parameterizer/defaultTransformation",
13+
dependencies = {})
14+
class DefaultTransformationTest implements CodemodTestMixin {}
15+
16+
@Nested
17+
@Metadata(
18+
codemodType = SQLParameterizerCodemod.class,
19+
testResourceDir = "sql-parameterizer/hijackTransformation",
20+
dependencies = {})
21+
class HijackTransformationTest implements CodemodTestMixin {}
22+
}

core-codemods/src/test/resources/defectdojo-sql-injection/SqlInjectionChallenge/SqlInjectionChallenge.java.after

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class SqlInjectionChallenge extends AssignmentEndpoint {
6868
"select userid from sql_challenge_users where userid = ?";
6969
PreparedStatement statement = connection.prepareStatement(checkUserQuery);
7070
statement.setString(1, username_reg);
71+
7172
ResultSet resultSet = statement.execute();
7273
if (resultSet.next()) {
7374
if (username_reg.contains("tom'")) {
@@ -84,7 +85,6 @@ public class SqlInjectionChallenge extends AssignmentEndpoint {
8485
preparedStatement.execute();
8586
attackResult = success(this).feedback("user.created").feedbackArgs(username_reg).build();
8687
}
87-
8888
} catch (SQLException e) {
8989
attackResult = failed(this).output("Something went wrong").build();
9090
}

core-codemods/src/test/resources/defectdojo-sql-injection/SqlInjectionLesson8/SqlInjectionLesson8.java.after

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ public class SqlInjectionLesson8 extends AssignmentEndpoint {
7070
try {
7171
PreparedStatement statement =
7272
connection.prepareStatement(
73-
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
73+
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
7474
log(connection, query);
7575
statement.setString(1, name);
76+
7677
statement.setString(2, auth_tan);
7778
ResultSet results = statement.execute();
7879
if (results.getStatement() != null) {
@@ -98,7 +99,6 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDAT
9899
} else {
99100
return failed(this).build();
100101
}
101-
102102
} catch (SQLException e) {
103103
return failed(this)
104104
.output("<br><span class='feedback-negative'>" + e.getMessage() + "</span>")
@@ -156,7 +156,7 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDAT
156156
statement.setString(1, sdf.format(cal.getTime()));
157157
statement.setString(2, action);
158158
statement.execute();
159-
} catch (SQLException e) {
159+
} catch (SQLException e) {
160160
System.err.println(e.getMessage());
161161
}
162162
}

core-codemods/src/test/resources/jexl-expression-injection/Test.java.after

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ public final class Test {
2727
JexlExpression expression = jexl.createExpression(input);
2828
JexlContext context = new MapContext();
2929
expression.evaluate(context);
30-
3130
}
3231
}
3332

@@ -42,7 +41,6 @@ public final class Test {
4241
sandbox.block(cls);
4342
}
4443
new JexlBuilder().sandbox(sandbox).create().createExpression(input).evaluate(context);
45-
4644
}
4745
}
4846

core-codemods/src/test/resources/move-switch-default-last/Test.java.after

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ final class Test {
1111
case "bar":
1212
System.out.println("bar");
1313
break;
14-
default:
15-
System.out.println("default"); }
14+
default:
15+
System.out.println("default");}
1616
System.out.println("bar");
1717
}
1818

core-codemods/src/test/resources/semgrep-sql-injection-formatted-sql-string/SqlInjectionLesson5a.java.after

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ public class SqlInjectionLesson5a extends AssignmentEndpoint {
6464
"SELECT * FROM user_data WHERE first_name = 'John' and last_name = ?";
6565
try (PreparedStatement statement =
6666
connection.prepareStatement(
67-
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
67+
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
6868
statement.setString(1, accountName);
69+
6970
ResultSet results = statement.execute();
7071
if ((results != null) && (results.first())) {
7172
ResultSetMetaData resultsMetaData = results.getMetaData();
@@ -90,7 +91,6 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATAB
9091
.output("Your query was: " + query)
9192
.build();
9293
}
93-
9494
} catch (SQLException sqle) {
9595
return failed(this).output(sqle.getMessage() + "<br> Your query was: " + query).build();
9696
}
@@ -135,4 +135,4 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATAB
135135
t.append("</p>");
136136
return (t.toString());
137137
}
138-
}
138+
}

core-codemods/src/test/resources/semgrep-sql-injection/SqlInjectionLesson8.java.after

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ public class SqlInjectionLesson8 extends AssignmentEndpoint {
7070
try {
7171
PreparedStatement statement =
7272
connection.prepareStatement(
73-
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
73+
query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
7474
log(connection, query);
7575
statement.setString(1, name);
76+
7677
statement.setString(2, auth_tan);
7778
ResultSet results = statement.execute();
7879
if (results.getStatement() != null) {
@@ -98,7 +99,6 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDAT
9899
} else {
99100
return failed(this).build();
100101
}
101-
102102
} catch (SQLException e) {
103103
return failed(this)
104104
.output("<br><span class='feedback-negative'>" + e.getMessage() + "</span>")
@@ -156,7 +156,7 @@ query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDAT
156156
statement.setString(1, sdf.format(cal.getTime()));
157157
statement.setString(2, action);
158158
statement.execute();
159-
} catch (SQLException e) {
159+
} catch (SQLException e) {
160160
System.err.println(e.getMessage());
161161
}
162162
}

core-codemods/src/test/resources/sonar-sql-injection-s2077/supported/SqlInjectionChallenge.java.after

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class SqlInjectionChallenge extends AssignmentEndpoint {
6868
"select userid from sql_challenge_users where userid = ?";
6969
PreparedStatement statement = connection.prepareStatement(checkUserQuery);
7070
statement.setString(1, username_reg);
71+
7172
ResultSet resultSet = statement.execute();
7273
if (resultSet.next()) {
7374
if (username_reg.contains("tom'")) {
@@ -84,7 +85,6 @@ public class SqlInjectionChallenge extends AssignmentEndpoint {
8485
preparedStatement.execute();
8586
attackResult = success(this).feedback("user.created").feedbackArgs(username_reg).build();
8687
}
87-
8888
} catch (SQLException e) {
8989
attackResult = failed(this).output("Something went wrong").build();
9090
}

core-codemods/src/test/resources/sql-parameterizer/Test.java.after renamed to core-codemods/src/test/resources/sql-parameterizer/defaultTransformation/Test.java.after

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public final class Test {
2323
stmt.setString(1, input);
2424
var rs = stmt.execute();
2525
return rs;
26-
}
26+
}
2727

2828
public ResultSet nameConflict(String input) throws SQLException {
2929
int stmt = 0;
@@ -33,7 +33,7 @@ public final class Test {
3333
ResultSet rs = statement.execute();
3434
stmt++;
3535
return rs;
36-
}
36+
}
3737

3838
public ResultSet doubleNameConflict(String input) throws SQLException {
3939
int stmt = 0;
@@ -44,7 +44,7 @@ public final class Test {
4444
ResultSet rs = stmt1.execute();
4545
stmt = stmt + statement;
4646
return rs;
47-
}
47+
}
4848

4949
public ResultSet tryResource(String input) throws SQLException {
5050
String sql = "SELECT * FROM USERS WHERE USER = ?";
@@ -62,7 +62,7 @@ public final class Test {
6262
stmt.setString(1, "user_" + input + "_name");
6363
stmt.setString(2, input2);
6464
return stmt.execute();
65-
}
65+
}
6666

6767
public ResultSet referencesAfterExecute(String input) throws SQLException {
6868
String sql = "SELECT * FROM USERS WHERE USER = ?";

0 commit comments

Comments
 (0)