Skip to content

Commit d61b1f5

Browse files
committed
Convert sql-injection test to inline expectations
1 parent 913dcb1 commit d61b1f5

3 files changed

Lines changed: 21 additions & 20 deletions

File tree

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
Security/CWE-089/SqlInjection.ql
1+
query: Security/CWE-089/SqlInjection.ql
2+
postprocess: utils/test/InlineExpectationsTestQuery.ql

python/ql/test/query-tests/Security/CWE-089-SqlInjection/sql_injection.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ class User(models.Model):
1111
pass
1212

1313
@app.route("/users/<username>")
14-
def show_user(username):
14+
def show_user(username): # $ Source
1515
with connection.cursor() as cursor:
1616
# GOOD -- Using parameters
1717
cursor.execute("SELECT * FROM users WHERE username = %s", username)
1818
User.objects.raw("SELECT * FROM users WHERE username = %s", (username,))
1919

2020
# BAD -- Using string formatting
21-
cursor.execute("SELECT * FROM users WHERE username = '%s'" % username)
21+
cursor.execute("SELECT * FROM users WHERE username = '%s'" % username) # $ Alert
2222

2323
# BAD -- other ways of executing raw SQL code with string interpolation
24-
User.objects.annotate(RawSQL("insert into names_file ('name') values ('%s')" % username))
25-
User.objects.raw("insert into names_file ('name') values ('%s')" % username)
26-
User.objects.extra("insert into names_file ('name') values ('%s')" % username)
24+
User.objects.annotate(RawSQL("insert into names_file ('name') values ('%s')" % username)) # $ Alert
25+
User.objects.raw("insert into names_file ('name') values ('%s')" % username) # $ Alert
26+
User.objects.extra("insert into names_file ('name') values ('%s')" % username) # $ Alert
2727

2828
# BAD (but currently no custom query to find this)
2929
#

python/ql/test/query-tests/Security/CWE-089-SqlInjection/sqlalchemy_textclause.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ class User(Base):
2020

2121

2222
@app.route("/users/<username>")
23-
def show_user(username):
23+
def show_user(username): # $ Source
2424
session = sqlalchemy.orm.Session(engine)
2525

2626
# BAD, normal SQL injection
27-
stmt = sqlalchemy.text("SELECT * FROM users WHERE username = '{}'".format(username))
27+
stmt = sqlalchemy.text("SELECT * FROM users WHERE username = '{}'".format(username)) # $ Alert
2828
results = session.execute(stmt).fetchall()
2929

3030
# BAD, allows SQL injection
31-
username_formatted_for_sql = sqlalchemy.text("'{}'".format(username))
31+
username_formatted_for_sql = sqlalchemy.text("'{}'".format(username)) # $ Alert
3232
stmt = sqlalchemy.select(User).where(User.username == username_formatted_for_sql)
3333
results = session.execute(stmt).scalars().all()
3434

@@ -38,14 +38,14 @@ def show_user(username):
3838

3939

4040
# All of these should be flagged by query
41-
t1 = sqlalchemy.text(username)
42-
t2 = sqlalchemy.text(text=username)
43-
t3 = sqlalchemy.sql.text(username)
44-
t4 = sqlalchemy.sql.text(text=username)
45-
t5 = sqlalchemy.sql.expression.text(username)
46-
t6 = sqlalchemy.sql.expression.text(text=username)
47-
t7 = sqlalchemy.sql.expression.TextClause(username)
48-
t8 = sqlalchemy.sql.expression.TextClause(text=username)
49-
50-
t9 = db.text(username)
51-
t10 = db.text(text=username)
41+
t1 = sqlalchemy.text(username) # $ Alert
42+
t2 = sqlalchemy.text(text=username) # $ Alert
43+
t3 = sqlalchemy.sql.text(username) # $ Alert
44+
t4 = sqlalchemy.sql.text(text=username) # $ Alert
45+
t5 = sqlalchemy.sql.expression.text(username) # $ Alert
46+
t6 = sqlalchemy.sql.expression.text(text=username) # $ Alert
47+
t7 = sqlalchemy.sql.expression.TextClause(username) # $ Alert
48+
t8 = sqlalchemy.sql.expression.TextClause(text=username) # $ Alert
49+
50+
t9 = db.text(username) # $ Alert
51+
t10 = db.text(text=username) # $ Alert

0 commit comments

Comments
 (0)