我有一个简单的表格:
{% block content %}
<p> Upload invoices </p>
<form method="post" action="{% url 'upload_thing ' %}" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="invoice_thing">
<button type="submit">Upload</button>
</form>
我有看法
@require_POST
@transaction.atomic
def upload_thing(request):
....
如何确保没有人可以通过curl或postman到达发布终点?
我希望只能通过单击表单按钮来访问终点。唯一可以执行此操作的人是管理员用户。
我如何做到这一点?
答案 0 :(得分:1)
说实话,您不应阻止来自Django应用程序的curl或wget请求。可以通过反向代理服务器来完成,例如在NGINX中,您可以进行以下配置:
if ($http_user_agent ~* (wget|curl) ) {
return 403;
}
尽管这不是一个适当的保护,但User-Agent
信息可以被欺骗。可以在此serverfault
答案中找到更多信息。
如果要阻止非管理员用户访问此页面,则可以对视图进行如下限制:
from django.core.exceptions import PermissionDenied
from django.contrib.auth.decorators import login_required
@login_required
@require_POST
@transaction.atomic
def upload_thing(request):
if not request.user.is_superuser:
raise PermissionDenied()
# rest of the code
答案 1 :(得分:0)
在python中执行此操作的正确方法是通过装饰器。
from django.contrib.auth.decorators import login_required, user_passes_test
@user_passes_test(lambda user: user.is_superuser)
def upload_thing(request):
通过这种方式,您可以限制方法而不是html页面。 因此,只有登录的管理员才能使用upload_thing(来自curl,邮递员或html表单)。