From c869207ea29822c81d5a242a1e401135d813a96c Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Tue, 7 Nov 2017 13:07:12 -0500 Subject: [2.0.x] Fixed #28770 -- Warned that quoting a placeholder in a raw SQL string is unsafe. Thanks Hynek Cernoch for the report and review. Backport of 327f0f37ce3c1e5ac3a19668add237ddd92266d6 from master --- docs/ref/models/expressions.txt | 18 +++++++++++++----- docs/ref/models/querysets.txt | 11 +++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'docs/ref/models') diff --git a/docs/ref/models/expressions.txt b/docs/ref/models/expressions.txt index f9dec50a5d..88981198c2 100644 --- a/docs/ref/models/expressions.txt +++ b/docs/ref/models/expressions.txt @@ -660,11 +660,19 @@ should avoid them if possible. .. warning:: - You should be very careful to escape any parameters that the user can - control by using ``params`` in order to protect against :ref:`SQL injection - attacks `. ``params`` is a required argument to - force you to acknowledge that you're not interpolating your SQL with user - provided data. + To protect against `SQL injection attacks + `_, you must escape any + parameters that the user can control by using ``params``. ``params`` is a + required argument to force you to acknowledge that you're not interpolating + your SQL with user-provided data. + + You also must not quote placeholders in the SQL string. This example is + vulnerable to SQL injection because of the quotes around ``%s``:: + + RawSQL("select col from sometable where othercol = '%s'") # unsafe! + + You can read more about how Django's :ref:`SQL injection protection + ` works. Window functions ---------------- diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index d6845cffd9..a5375ea371 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -1284,8 +1284,15 @@ generated by a ``QuerySet``. You should be very careful whenever you use ``extra()``. Every time you use it, you should escape any parameters that the user can control by using - ``params`` in order to protect against SQL injection attacks . Please - read more about :ref:`SQL injection protection `. + ``params`` in order to protect against SQL injection attacks. + + You also must not quote placeholders in the SQL string. This example is + vulnerable to SQL injection because of the quotes around ``%s``:: + + "select col from sometable where othercol = '%s'" # unsafe! + + You can read more about how Django's :ref:`SQL injection protection + ` works. By definition, these extra lookups may not be portable to different database engines (because you're explicitly writing SQL code) and violate the DRY -- cgit v1.3