使用 django-twilio 包伪造保护正在创建禁止的 403 错误

Using django-twilio package forgery protection is creating forbidden 403 error

我正在使用 django-twilio 包进行伪造保护 django-twilio forgery protection docs

我有一个 Django 短信应用程序,用于在登录时直接通过我的手机信使和我的网站发送自动消息。当 DJANGO_TWILIO_FORGERY_PROTECTION = False 时,两个平台都使用我的 Django 短信应用程序工作。

当 DJANGO_TWILIO_FORGERY_PROTECTION = True 时,只有手机信使可用,网站会收到 403 禁止访问权限。

如何解决这个问题,同时保持尽可能多的安全性并保持同一应用程序在手机信使和网站上的功能。

我知道问题与@twilio_view装饰器有关

发送-text.html

    <form action="{% url 'text-send' %}" enctype="multipart/form-data" method="POST">
    {% csrf_token %}
    <input type="text" name="Body" required>
    <input type="submit" >
    </form>

这是我的短信应用:

@twilio_view
def sendtext(request, reviewpk):
    if request.method == "POST":
        ACCOUNT_SID = settings.TWILIO_ACCOUNT_SID
        AUTH_TOKEN = settings.TWILIO_AUTH_TOKEN
        client = Client(ACCOUNT_SID, AUTH_TOKEN)

        message_body = request.POST['Body']
        client.messages.create(
           to= "+13231342344",
           from_="+14571342764",
           body=message_body
         )
        return confirm_things(request)

def confirm_things(request):  
    if 'HTTP_X_TWILIO_SIGNATURE' in request.META:
        resp = MessagingResponse()
        resp.message("good job message was sent")
        return HttpResponse(str(resp), content_type='text/xml')          
    return HttpResponseRedirect(reverse('dashboard'))  

urls.py

urlpatterns = [
    path('textsend/', views.sendtext, name='text-send'),
    path('dashboard/', views.dash, name='dash'),
]

尝试包括@csrf_exempt装饰器

导入它 from django.views.decorators.csrf import csrf_exempt

然后在函数中

@csrf_exempt
@twilio_view
def sendtext(request, reviewpk):
    if request.method == "POST":
        ACCOUNT_SID = settings.TWILIO_ACCOUNT_SID
        AUTH_TOKEN = settings.TWILIO_AUTH_TOKEN
        client = Client(ACCOUNT_SID, AUTH_TOKEN)

        message_body = request.POST['Body']
        client.messages.create(
           to= "+13231342344",
           from_="+14571342764",
           body=message_body
         )
        return confirm_things(request)

希望对您有所帮助!

这里是 Twilio 开发人员布道者。

DJANGO_TWILIO_FORGERY_PROTECTION = True 应该只用于来自 Twilio 的 webhook 请求。

您应该使用常规会话(或其他)身份验证以及现有的 CSRF 保护来验证您的用户表单提交。基本上,您不应该对任何不响应 Twilio 的控制器操作使用 @twilio_view