猿问

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

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


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


当 DJANGO_TWILIO_FORGERY_PROTECTION = True 时,只有手机信使工作,网站得到 403 Forbidden。


如何在保持尽可能多的安全性并保持相同的应用程序对手机信使和网站正常运行的同时解决此问题。


我知道问题与@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'),

]


侃侃无极
浏览 75回答 2
2回答

慕的地10843

Twilio 开发人员布道者在这里。DJANGO_TWILIO_FORGERY_PROTECTION = True应该只用于来自 Twilio 的 webhook 请求。您应该使用常规会话(或其他)身份验证以及现有的 CSRF 保护来验证您的用户表单提交。基本上,您不应该使用@twilio_view任何不响应 Twilio 的控制器操作。

犯罪嫌疑人X

尝试包括 @csrf_exempt 装饰器导入它 from django.views.decorators.csrf import csrf_exempt然后在函数中@csrf_exempt@twilio_viewdef sendtext(request, reviewpk):&nbsp; &nbsp; if request.method == "POST":&nbsp; &nbsp; &nbsp; &nbsp; ACCOUNT_SID = settings.TWILIO_ACCOUNT_SID&nbsp; &nbsp; &nbsp; &nbsp; AUTH_TOKEN = settings.TWILIO_AUTH_TOKEN&nbsp; &nbsp; &nbsp; &nbsp; client = Client(ACCOUNT_SID, AUTH_TOKEN)&nbsp; &nbsp; &nbsp; &nbsp; message_body = request.POST['Body']&nbsp; &nbsp; &nbsp; &nbsp; client.messages.create(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;to= "+13231342344",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;from_="+14571342764",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;body=message_body&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)&nbsp; &nbsp; &nbsp; &nbsp; return confirm_things(request)希望这可以帮助!
随时随地看视频慕课网APP

相关分类

Python
我要回答