#37105: Admin change form actions should only allow applying to object from the
change form
---------------------------------+---------------------------------------
     Reporter:  Sarah Boyce      |                    Owner:  Sarah Boyce
         Type:  Bug              |                   Status:  assigned
    Component:  contrib.admin    |                  Version:  dev
     Severity:  Release blocker  |               Resolution:
     Keywords:                   |             Triage Stage:  Accepted
    Has patch:  1                |      Needs documentation:  0
  Needs tests:  0                |  Patch needs improvement:  1
Easy pickings:  0                |                    UI/UX:  0
---------------------------------+---------------------------------------
Description changed by Sarah Boyce:

Old description:

> We had a few security reports against the new admin change form action
> feature that a user could tamper with the `_selected_action` value and
> then run the action against a different object, with concerns that the
> same user may not be able to view or change that admin object.
>
> I think a `BadRequest` should be raised if the `_selected_action` value
> does not match the url it was sent from
>
> {{{#!diff
> --- a/tests/admin_views/test_actions.py
> +++ b/tests/admin_views/test_actions.py
> @@ -667,6 +667,24 @@ class AdminDetailActionsTest(TestCase):
>          self.assertEqual(response.status_code, 200)
>          self.assertEqual(response.content, b"OK")
>
> +    def test_action_changeform_cannot_target_different_objects(self):
> +        changeform_url =
> reverse("admin:admin_views_externalsubscriber_change", args=[self.s1.pk])
> +        external_subscriber = ExternalSubscriber.objects.create(
> +            name="Jane Austin", email="[email protected]"
> +        )
> +        for invalid_checkbox_value in [[external_subscriber.pk],
> [self.s1.pk, external_subscriber.pk]]:
> +            with
> self.subTest(invalid_checkbox_value=invalid_checkbox_value):
> +                response = self.client.post(
> +                    changeform_url,
> +                    {
> +                        "CHANGE_FORM-action": "external_mail",
> +                        ACTION_CHECKBOX_NAME: [invalid_checkbox_value],
> +                        "index": 0,
> +                    },
> +                )
> +                self.assertEqual(len(mail.outbox), 0)
> +                self.assertEqual(response.status_code, 400)
> +
>      def test_select_across_ignored(self):
> }}}

New description:

 We had a few security reports against the new admin change form action
 feature that a user could tamper with the `_selected_action` value and
 then run the action against a different object, with concerns that the
 same user may not be able to view or change that admin object.

 I think a `BadRequest` should be raised if the `_selected_action` value
 does not match the url it was sent from

 {{{#!diff
 --- a/tests/admin_views/test_actions.py
 +++ b/tests/admin_views/test_actions.py
 @@ -667,6 +667,24 @@ class AdminDetailActionsTest(TestCase):
          self.assertEqual(response.status_code, 200)
          self.assertEqual(response.content, b"OK")

 +    def test_action_changeform_cannot_target_different_objects(self):
 +        changeform_url =
 reverse("admin:admin_views_externalsubscriber_change", args=[self.s1.pk])
 +        external_subscriber = ExternalSubscriber.objects.create(
 +            name="Jane Austin", email="[email protected]"
 +        )
 +        for invalid_checkbox_value in [[external_subscriber.pk],
 [self.s1.pk, external_subscriber.pk]]:
 +            with
 self.subTest(invalid_checkbox_value=invalid_checkbox_value):
 +                response = self.client.post(
 +                    changeform_url,
 +                    {
 +                        "CHANGE_FORM-action": "external_mail",
 +                        ACTION_CHECKBOX_NAME: invalid_checkbox_value,
 +                        "index": 0,
 +                    },
 +                )
 +                self.assertEqual(len(mail.outbox), 0)
 +                self.assertEqual(response.status_code, 400)
 +
      def test_select_across_ignored(self):
 }}}

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/37105#comment:4>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/0107019e3ed476b7-1113ee92-b8da-47d6-b6e1-e947aee3d1bd-000000%40eu-central-1.amazonses.com.

Reply via email to