0
votes

Un utilisateur peut modifier manuellement une autre vue utilisateur de l'URL

Je viens de remarquer qu'un utilisateur peut accéder manuellement à une autre vue de profil de mise à jour d'utilisateurs en passant à l'autre utilisateur PK ou Nom d'utilisateur (comme Slug) de l'URL. par exemple xxx pré>

permet de dire que l'URL du profil de mise à jour des utilisateurs, si cet utilisateur modifie le PK à 19 et modifier, l'utilisateur avec PK 19 profil sera modifié, est-ce un bogue ou est-ce Ceci une erreur de mon côté? Merci. P>

Mon affichage ici P>

path('account/dashboard/<int:pk>/updateprofile', views.ProfilepdateView.as_view(), name="updateprofile"),


4 commentaires

Cela semble être vraiment une question sur la conception et la sécurité Web, et non une question sur la programmation.


Thats comment MoonPIG exposé les données de clients , qu'il s'agisse d'une fonctionnalité ou d'un bogue dépend de votre application. .


Django ne sait pas qui est autorisé à accéder à la vue, c'est à vous de prendre soin de cela dans la vue. Si vous Modifier Votre question pour inclure votre motif de vue et de votre URL, nous pouvons suggérer comment restreindre l'accès.


Oh je vois, je ne savais pas, je comprends maintenant que Django ne sait pas qui est autorisé à accéder à la vue.


3 Réponses :


5
votes

C'est à vous de contrôler qui peut faire quoi et où - Django ne peut pas le deviner. Vous avez deux solutions ici:

1 / Gardez votre URL comme c'est le cas, mais vérifiez si l'utilisateur actuel ( request.User.User.User.User.User>) est autorisé à modifier ce profil: xxx

2 / Supprimer le profil_id de l'URL et utilisez request.User pour obtenir le profil actuel de l'utilisateur xxx


3 commentaires

Merci pour votre réponse, mais c'est une vue générique, pas une vue basée sur la fonction, que suggérez-vous? J'ai mis à jour la question pour montrer la vue. Merci


J'évite effectivement les CBV autant que possible - la plupart du temps, ils ne font que compliquer les choses inutilement, et ils n'en aident vraiment pas les nouveaux arrivants ... maintenant au lieu d'un changement très simple dans une fonction très simple, vous devez trouver quelle méthode Parmi lequel de la douzaine de classes de parents ou plus, vous devez remplacer.


Ou mieux: utilisez le userpassestestestest mixin, cf Stackoverflow.com/questions/29682704/...



1
votes

Merci tous mes chefs et masters aptes, c'était ce que j'ai ajouté à ma vue pour résoudre le problème.

class ProfilepdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    login_url = 'userlogin'
    fields = ('age', 'location')
    model = UserProfile
    template_name = 'account/updateprofile.html'
    success_message = "Your profile was successfully updated"

    def get_queryset(self):
        profile= super().get_queryset()
        return profile.filter(user=self.request.user)


0 commentaires

0
votes

Avec cela, d'autres utilisateurs seraient toujours en mesure d'accéder à d'autres utilisateurs, mais ne seraient pas en mesure de la mettre à jour. Si vous vouliez à l'origine que seul le propriétaire d'un profil puisse accéder à la page de mise à jour, vous pouvez limiter la vue dans le modèle. xxx

ou juste en vue.


2 commentaires

Merci Bro je sais cela, je voulais juste le gérer dans la vue et non dans le modèle. Je ne voulais pas que les informations soient rendues à la page. Ce n'est qu'un utilisateur de baskets qui changera manuellement le PK dans l'URL, donc avec cette fonction GET_QUERYSET si un utilisateur de baskets tente de le faire, il sera envoyé à une page 404. Personnellement, je pense que c'est mieux que de laisser un utilisateur sournois a accès à la page même s'il ne voit pas les informations.


Ouais .. parfois, je limite délibérément l'utilisateur sournois dans le modèle juste pour narguer l'utilisateur. Comme, mettez une notification sur l'utilisateur étant sournois.