]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-96250: Improve sqlite3 injection attack example (#99270)
authorJia Junjie <62194633+jiajunjie@users.noreply.github.com>
Thu, 8 Dec 2022 20:37:08 +0000 (04:37 +0800)
committerGitHub <noreply@github.com>
Thu, 8 Dec 2022 20:37:08 +0000 (21:37 +0100)
Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM>
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
Doc/library/sqlite3.rst

index 960f2966afe1f2eb3ed1355d526eee964da32747..2b6387cbfb52889eb67c4db7c84cd8c8a3eb0edb 100644 (file)
@@ -1929,12 +1929,16 @@ How to use placeholders to bind values in SQL queries
 
 SQL operations usually need to use values from Python variables. However,
 beware of using Python's string operations to assemble queries, as they
-are vulnerable to `SQL injection attacks`_ (see the `xkcd webcomic
-<https://xkcd.com/327/>`_ for a humorous example of what can go wrong)::
-
-   # Never do this -- insecure!
-   symbol = 'RHAT'
-   cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
+are vulnerable to `SQL injection attacks`_. For example, an attacker can simply
+close the single quote and inject ``OR TRUE`` to select all rows::
+
+   >>> # Never do this -- insecure!
+   >>> symbol = input()
+   ' OR TRUE; --
+   >>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
+   >>> print(sql)
+   SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
+   >>> cur.execute(sql)
 
 Instead, use the DB-API's parameter substitution. To insert a variable into a
 query string, use a placeholder in the string, and substitute the actual values