mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.6.x] Fixed queries that may return unexpected results on MySQL due to typecasting.
This is a security fix. Disclosure will follow shortly.
Backport of 75c0d4ea3a from master
			
			
This commit is contained in:
		| @@ -504,6 +504,22 @@ MySQL does not support the ``NOWAIT`` option to the ``SELECT ... FOR UPDATE`` | ||||
| statement. If ``select_for_update()`` is used with ``nowait=True`` then a | ||||
| ``DatabaseError`` will be raised. | ||||
|  | ||||
| Automatic typecasting can cause unexpected results | ||||
| -------------------------------------------------- | ||||
|  | ||||
| When performing a query on a string type, but with an integer value, MySQL will | ||||
| coerce the types of all values in the table to an integer before performing the | ||||
| comparison. If your table contains the values ``'abc'``, ``'def'`` and you | ||||
| query for ``WHERE mycolumn=0``, both rows will match. Similarly, ``WHERE mycolumn=1`` | ||||
| will match the value ``'abc1'``. Therefore, string type fields included in Django | ||||
| will always cast the value to a string before using it in a query. | ||||
|  | ||||
| If you implement custom model fields that inherit from :class:`~django.db.models.Field` | ||||
| directly, are overriding :meth:`~django.db.models.Field.get_prep_value`, or use | ||||
| :meth:`extra() <django.db.models.query.QuerySet.extra>` or | ||||
| :meth:`raw() <django.db.models.Manager.raw>`, you should ensure that you | ||||
| perform the appropriate typecasting. | ||||
|  | ||||
| .. _sqlite-notes: | ||||
|  | ||||
| SQLite notes | ||||
|   | ||||
| @@ -1132,6 +1132,16 @@ of the arguments is required, but you should use at least one of them. | ||||
|  | ||||
|       Entry.objects.extra(where=['headline=%s'], params=['Lennon']) | ||||
|  | ||||
| .. warning:: | ||||
|  | ||||
|     If you are performing queries on MySQL, note that MySQL's silent type coercion | ||||
|     may cause unexpected results when mixing types. If you query on a string | ||||
|     type column, but with an integer value, MySQL will coerce the types of all values | ||||
|     in the table to an integer before performing the comparison. For example, if your | ||||
|     table contains the values ``'abc'``, ``'def'`` and you query for ``WHERE mycolumn=0``, | ||||
|     both rows will match. To prevent this, perform the correct typecasting | ||||
|     before using the value in a query. | ||||
|  | ||||
| defer | ||||
| ~~~~~ | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user