我想授予用户删除他们添加到数据库的模型实例的权限.在django文档中,它说允许某人从模板中删除不是一个好习惯.有没有一种安全的方法让用户从模板中单击"删除此"链接并删除该模型实例?我应该怎么做呢?
查看此问题以获得与您所询问相关的讨论.
基本上,当您通常单击页面上的链接时,浏览器会GET
向服务器发出请求以获取下一页的内容.就像有很多推动语义相关的CSS布局一样,页面请求与语义相关也很重要.使用链接删除项目的问题在于它正在向数据库中的某些内容发出GET
请求DELETE
.由此产生的问题是某些搜索引擎可能会索引您的链接并意外删除内容.还存在跨站点请求伪造的问题,这可能使得毫无戒心的用户在不知情的情况下向网站发出命令.因此,处理此问题的正确方法是遵循以下规则:任何修改服务器状态的请求都应通过POST处理.因此,而不是这样做:
Delete Item
最好这样做:
如果您想在保持链接的同时保留链接,则POST
必须使用Javascript:
Delete Item
不好看,是的,但它是最好的.您的Django视图将执行以下操作:
def remove_item(request): if request.method == 'POST': ## remove item
此外,正如Scott所提到的,Django有一些内置的东西可以帮助你避免我上面提到的跨站点请求伪造,因为即使你正在进行POST(稍微更难)它仍然可以做到这一点.避免这种情况的方法是在允许执行操作之前将某种令牌绑定到需要在服务器端验证的表单.查看CsrfMiddleware类以获取更多详细信息.它基本上可以为您自动完成部分工作.
URI,可寻址性以及HTTP GET和POST的使用
9.1.1安全方法,HTTP 1.1,RFC 2616
万维网的体系结构,第一卷
使用带有常规链接的POST
跨站请求伪造和您