如何在Django中保护URL

时间:2016-05-13 19:35:08

标签: python django security url

有没有办法阻止用户访问应用程序中的某些(或所有)URL?例如,我正在关注Django教程,其中一个示例有一个URL:

#music/album/<pk>/delete
url(r'image/(?P<pk>[0-9]+)/delete/$', views.ImageDelete.as_view(), name='image-delete'),
删除数据库条目的

pk作为参数。当然,现在可以通过使用任何现有的主键复制粘贴URL来删除此条目,那么避免它的最佳做法是什么?感谢

编辑。根据回复和评论,我决定详细说明一下。我实际上正在使用DeleteViewPOST请求表单作为@solarissmoke在回答中建议。

<form action="{% url 'album:image-delete' image.id%}" method="post" style="display: inline;">
{% csrf_token %}
    <input type="hidden" name="image_id" value="{{ image.id }}"/>
        <button type="submit" class="btn btn-default btn-sm">
            <span class="glyphicon glyphicon-trash"></span>
        </button>
</form>

和我的views.py

class ImageDelete(DeleteView):
    model = Album
    # if you successfully delete the object, page redirects to <homepage>
    success_url = reverse_lazy('album:index')

因此,几乎没有建议检查用户是否经过验证可以删除URL条目(例如图像)并添加弹出/通知以验证用户确实是否要删除该条目。但是,它并不像是一个完整的解决方案。在评论中我带来了Facebook的例子,你可以通过复制粘贴删除 URL来删除imeage / post。当然,我并不是要求类似Facebook的安全性,但是,我真的很好奇如何保护URL,以便普通用户几乎不可能通过简单的复制粘贴来删除条目。再次感谢!

2 个答案:

答案 0 :(得分:2)

最佳做法是,您不应允许通过HTTP GET请求修改此类数据,这些请求(顾名思义)用于获取数据而非更新数据。

您应该使用表单和POST请求来执行删除对象等操作.Django提供lots of helper views来执行此操作。例如DeleteView

  

显示确认页面并删除现有对象的视图。仅当请求方法为POST时,才会删除给定对象。如果通过GET获取此视图,则会显示一个确认页面,该页面应包含POST到同一网址的表单。

使用这些视图的好处是:

答案 1 :(得分:1)

有很多方法......例如:

user = request.user
if user.is_authenticated() and user.profile.can_delete_image(image_pk):
    # only then, image can be deleted by this user
    # can_delete_image(image_pk) is defined by you
else: 
    raise DeletePermissionDenied # you can define your own Exception, just for fun