允许用户删除他们添加到数据库的模型实例的最佳安全方法是什么?

0 python django

我想授予用户删除他们添加到数据库的模型实例的权限.在django文档中,它说允许某人从模板中删除不是一个好习惯.有没有一种安全的方法让用户从模板中单击"删除此"链接并删除该模型实例?我应该怎么做呢?

Pao*_*ino 7

查看此问题以获得与您所询问相关的讨论.

基本上,当您通常单击页面上的链接时,浏览器会GET向服务器发出请求以获取下一页的内容.就像有很多推动语义相关的CSS布局一样,页面请求与语义相关也很重要.使用链接删除项目的问题在于它正在向数据库中的某些内容发出GET请求DELETE.由此产生的问题是某些搜索引擎可能会索引您的链接并意外删除内容.还存在跨站点请求伪造的问题,这可能使得毫无戒心的用户在不知情的情况下向网站发出命令.因此,处理此问题的正确方法是遵循以下规则:任何修改服务器状态的请求都应通过POST处理.因此,而不是这样做:

<a href="{% url remove_item item.id %}">Delete Item</a>
Run Code Online (Sandbox Code Playgroud)

最好这样做:

<form action='{% url remove_item %}' method='POST' id='form'>
    <input type='hidden' name='action' value='delete'>
    <input type='hidden' name='id' value='{{ item.id }}'>
    <input type="submit" value="Delete Item">
</form>
Run Code Online (Sandbox Code Playgroud)

如果您想在保持链接的同时保留链接,则POST必须使用Javascript:

<a href="#" onclick="document.getElementById('form').submit(); return false;">Delete Item</a>
Run Code Online (Sandbox Code Playgroud)

不好看,是的,但它是最好的.您的Django视图将执行以下操作:

def remove_item(request):
    if request.method == 'POST':
        ## remove item
Run Code Online (Sandbox Code Playgroud)

此外,正如Scott所提到的,Django有一些内置的东西可以帮助你避免我上面提到的跨站点请求伪造,因为即使你正在进行POST(稍微更难)它仍然可以做到这一点.避免这种情况的方法是在允许执行操作之前将某种令牌绑定到需要在服务器端验证的表单.查看CsrfMiddleware类以获取更多详细信息.它基本上可以为您自动完成部分工作.

补充阅读