Skip to content

Commit 41d4ac9

Browse files
jiajunjieCAM-Gerlacherlend-aasland
authored
gh-96250: Improve sqlite3 injection attack example (#99270)
Co-authored-by: C.A.M. Gerlach <[email protected]> Co-authored-by: Erlend E. Aasland <[email protected]>
1 parent cd67c1b commit 41d4ac9

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

Doc/library/sqlite3.rst

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,12 +1929,16 @@ How to use placeholders to bind values in SQL queries
19291929

19301930
SQL operations usually need to use values from Python variables. However,
19311931
beware of using Python's string operations to assemble queries, as they
1932-
are vulnerable to `SQL injection attacks`_ (see the `xkcd webcomic
1933-
<https://xkcd.com/327/>`_ for a humorous example of what can go wrong)::
1934-
1935-
# Never do this -- insecure!
1936-
symbol = 'RHAT'
1937-
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
1932+
are vulnerable to `SQL injection attacks`_. For example, an attacker can simply
1933+
close the single quote and inject ``OR TRUE`` to select all rows::
1934+
1935+
>>> # Never do this -- insecure!
1936+
>>> symbol = input()
1937+
' OR TRUE; --
1938+
>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
1939+
>>> print(sql)
1940+
SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
1941+
>>> cur.execute(sql)
19381942

19391943
Instead, use the DB-API's parameter substitution. To insert a variable into a
19401944
query string, use a placeholder in the string, and substitute the actual values

0 commit comments

Comments
 (0)