Conas cosaint CSRF Django a úsáidLink to this heading

Chun leas a bhaint as cosaint CSRF i do thuairimí, lean na céimeanna seo:

  1. Cuirtear an middleware CSRF i ngníomh de réir réamhshocraithe sa shocrú:: MIDDLEWARE. Má sháraigh tú an socrú sin, cuimhnigh gur chóir go dtiocfadh ``django.middleware.csrf.csrfviewMiddleware'` roimh aon mheán dearcadh a ghlacann leis gur déileáladh le hionsaithe CSRF.

    Má dhíchumasaigh tú é, nach moltar, is féidir leat: func: ~django.views.decorators.csrf.csrf_protect a úsáid ar thuairimí áirithe ar mhaith leat a chosaint (féach thíos).

  2. In aon teimpléad a úsáideann foirm POST, bain úsáid as an clibe:ttag: csrf_token taobh istigh den eilimint ```má tá an fhoirm le haghaidh URL inmheánach, <form>m.sh.:

    Django template
    <form method="post">{% csrf_token %}
    

    Níor cheart é seo a dhéanamh le haghaidh foirmeacha POST a dhíríonn ar URLanna seachtracha, mar go mbeadh sé sin ina chúis le sceitheadh ​​an chomhartha CSRF, rud a d’fhágfadh go mbeadh leochaileacht ann.

  3. Sna feidhmeanna amharc comhfhreagracha, cinntigh go n-úsáidtear: class: ~django.template.requestContext chun an freagra a thabhairt ionas go n-oibreoidh {% csrf_token%} `i gceart. ag úsáid an fheidhme:func: `~django.shortcuts.render`, tuairimí cineálacha, aipeanna contrib, clúdaithe cheana ós rud é go n-úsáideann siad seo go léir ``RequestContext.

Cosaint CSRF a úsáid le AJAXLink to this heading

Cé gur féidir an modh thuas a úsáid le haghaidh iarratais AJAX POST, tá roinnt míchompordach aige: caithfidh tú cuimhneamh an comhartha CSRF a chur isteach mar shonraí POST le gach iarratas POST. Ar an gcúis seo, tá modh malartach ann: ar gach XMLHttpRequest, socraigh ceannteideal saincheaptha ``X-CSRFToken` (mar a shonraítear leis an socrú:setting: CSRF_HEADER_NAME) le luach an chomhartha CSRF. Is minic a bhíonn sé seo níos éasca toisc go soláthraíonn go leor creataí JavaScript crúcaí a cheadaíonn ceanntásca a shocrú ar gach iarratas.

Ar dtús, ní mór duit an comhartha CSRF a fháil. Braitheann conas é sin a dhéanamh ar an bhfuil na socruithe: 'CSRF_USE_SESSIONS` agus:setting: CSRF_COOKIE_HTTPONLY cumasaithe nó nach bhfuil.

An comhartha a shocrú ar an iarratas AJAXLink to this heading

Faoi dheireadh, beidh ort an ceanntásc a shocrú ar d'iarratas AJAX. Ag baint úsáide as an API `fetch () `_:

JavaScript
const request = new Request(
    /* URL */,
    {
        method: 'POST',
        headers: {'X-CSRFToken': csrftoken},
        mode: 'same-origin' // Do not send CSRF token to another domain.
    }
);
fetch(request).then(function(response) {
    // ...
});

Cosaint CSRF a úsáid i dteimpléid Jinja2Link to this heading

Django's:class: ~django.template.backends.jinja2.jinja2 cuireann cúltaca teimpléad {{csrf_input}} le comhthéacs na teimpléid go léir atá comhionann le {% csrf_token%} sa teanga teimpléid Django. Mar shampla:

Html Jinja
<form method="post">{{ csrf_input }}

An modh maisitheora a úsáidLink to this heading

Seachas ``csrfViewMiddleware` a chur leis mar chosaint blaincéid, is féidir leat an maisitheoir: func: ~django.views.decorators.csrf.csrf_protect a úsáid, a bhfuil an fheidhmiúlacht chéanna díreach aige, ar thuairimí áirithe a dteastaíonn an cosaint uathu. Caithfear é a úsáid**an bheath** ar thuairimí a chuireann an comhartha CSRF isteach san aschur, agus ar na tuairimí a ghlacann leis na sonraí foirme POST. (Is minic gurb iad seo an fheidhm radharc céanna, ach ní i gcónaí).

Ní mholtar an maisitheoir a úsáid leis féin **, ós rud é má dhéanann tú dearmad é a úsáid, beidh poll slándála agat. Tá an straitéis 'crios agus brísea' chun an dá cheann a úsáid go breá, agus beidh lasbhreas íosta ann.

Iarrataí a dhiúltaitheLink to this heading

De réir réamhshocraithe, seoltar freagra '403 Forbidden' chuig an úsáideoir má theipeann ar iarratas isteach ar na seiceálacha a dhéanann ``CSRFViewMiddleware`. Níor cheart é seo a fheiceáil de ghnáth ach nuair a bhíonn fíorbhóideacht Iarratas Tras-Láithreáin ann, nó nuair nach bhfuil an comhartha CSRF san áireamh le foirm POST mar gheall ar earráid cláraithe.

Níl an leathanach earráide an-chairdiúil, áfach, mar sin b'fhéidir gur mhaith leat do dhearcadh féin a sholáthar chun an riocht seo a láimhseáil. Chun seo a dhéanamh, socraigh an socrú: setting: CSRF_FAILURE_VIEW.

<django-security-logger>Déantar teipeanna CSRF a logáil mar rabhaidh don logger: ref: `django.security.csrf `.

Cosaint CSRF a úsáid le cachingLink to this heading

Má úsáideann teimpléad an chlib teimpléad:ttag: csrf_token (nó tugtar bealach eile ar an bhfeidhm get_token), cuirfidh CSRFViewMiddleware` fianán agus ceannteideal Vary: Cookie leis an bhfreagra. Ciallaíonn sé seo go n-imrífidh an middleware go maith leis an middleware taisce má úsáidtear é mar a threoraítear (téann ``UpdateCacheMiddleware` roimh gach meán-earraí eile).

Mar sin féin, má úsáideann tú maisitheoirí taisce ar thuairimí aonair, ní bheidh an middleware CSRF in ann an ceannteideal Vary nó an fianán CSRF a shocrú fós, agus cuirfear an freagra a chosc gan ceachtar ceann amháin. Sa chás seo, ar aon tuairimí a éilíonn comhartha CSRF a chur isteach ba chóir duit an maisitheoir: func: django.views.decorators.csrf.csrf_protect a úsáid ar dtús:

Code
from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect


@cache_page(60 * 15)
@csrf_protect
def my_view(request): ...

<decorating-class-based-views>Má tá tuairimí bunaithe ar rang-bhunaithe á úsáid agat, is féidir leat tagairt a thabhairt do:ref: `Tuairimí rangbhunaithe a mhaisiú `.

Tástáil agus cosaint CSRFLink to this heading

De ghnáth beidh an CSRFViewMiddleware 'ina bhac mór ar fheidhmeanna radhairc a thástáil, mar gheall ar an ngá atá leis an gcomhartha CSRF nach mór a sheoladh le gach iarratas POST. Ar an gcúis seo, modhnaíodh cliant HTTP Django le haghaidh tástálacha chun bratach a shocrú ar iarratais a mhaolann an middleware agus an maisitheoir csrf_protect` ionas nach dhiúltaíonn siad iarratais a thuilleadh. I ngach leith eile (m.sh. fianáin a sheoladh srl.), iompraíonn siad mar an gcéanna.

Más mian leat, ar chúis éigin, * an cliant tástála seiceálacha CSRF a dhéanamh, is féidir leat sampla den chliant tástála a chruthú a fhorfheidhmíonn seiceálacha CSRF:

Python console
>>> from django.test import Client
>>> csrf_client = Client(enforce_csrf_checks=True)

Cásanna imeallLink to this heading

Is féidir go mbeadh riachtanais neamhghnácha ag tuairimí áirithe a chiallaíonn nach n-oireann siad don ghnáthphatrún Is féidir le roinnt fóntais a bheith úsáideach sna cásanna seo. Déantar cur síos ar na cásanna a d'fhéadfadh a bheith ag teastáil iontu sa chuid seo a leanas.

Cosaint CSRF a dhíchumasú le haghaidh ach cúpla tuairimLink to this heading

Éilíonn cosaint CSRF ar an gcuid is mó de na tuairimí, ach níl cúpla ceann acu.

Réiteach: seachas an middleware a dhíchumasú agus csrf_protect` a chur i bhfeidhm ar na tuairimí go léir a theastaíonn uathu, cumasaigh an middleware agus úsáide:func: ~django.views.decorators.csrf.csrf_exempt.

An comhartha a shocrú nuair nach n-úsáidtear ``CSRFViewMiddleware.process_view () ``Link to this heading

Tá cásanna ann nuair nach raibh CSRFViewMiddleware.process_view` rith sula ndéantar do radharc a reáchtáil - 404 agus 500 láimhseálaí, mar shampla - ach teastaíonn an comhartha CSRF uait fós i bhfoirm.

Réiteach: úsáid: func: ~django.views.decorators.csrf.requires_csrf_token

An comhartha CSRF san áireamh i radharc gan chosaintLink to this heading

D'fhéadfadh go mbeadh roinnt tuairimí ann nach bhfuil gan chosaint agus a bhfuil díolmhaithe orthu ag csrf_exempt`, ach ní mór an comhartha CSRF a áireamh fós.

Réiteach: úsáid: func: ~django.views.decorators.csrf.csrf_exempt ina dhiaidh sin: func: ~django.views.decorators.csrf.requires_csrf_token. (ie, ba chóir go mbeadh requires_csrf_token` an maisitheoir is istigh).

Radharc a chosaint le haghaidh cosán amháin amháinLink to this heading

Teastaíonn cosaint CSRF ó dhearcadh faoi shraith amháin coinníollacha amháin, agus níor cheart dó é a bheith aige don chuid eile den am.

Réiteach: úsáid: func: ~django.views.decorators.csrf.csrf_exempt don fheidhm amharc iomlán, agus:func: ~django.views.decorators.csrf.csrf_protect don chosán laistigh de dhíth a chosaint air. Sampla:

Code
from django.views.decorators.csrf import csrf_exempt, csrf_protect


@csrf_exempt
def my_view(request):
    @csrf_protect
    def protected_path(request):
        do_something()

    if some_condition():
        return protected_path(request)
    else:
        do_something_else()

Leathanach a chosaint a úsáideann AJAX gan foirm HTMLLink to this heading

Déanann leathanach iarratas POST trí AJAX, agus níl foirm HTML ag an leathanach le a:ttag: csrf_token a chuirfeadh an fianán CSRF riachtanach a sheoladh.

Réiteach: úsáid: func: ~django.views.decorators.csrf.ensure_csrf_cookie ar an radharc a sheolann an leathanach.

Cosaint CSRF in iarratais in-athúsáidteLink to this heading

Toisc go bhfuil sé indéanta don fhorbróir an CSRFViewMiddleware a mhúchadh, úsáideann gach tuairim ábhartha in aipeanna contrib an maisitheoir csrf_protect` chun slándáil na bhfeidhmchlár seo i gcoinne CSRF a chinntiú. Moltar go n-úsáideann forbróirí aipeanna in-athúsáidte eile a dteastaíonn na ráthaíochtaí céanna uathu an maisitheoir csrf_protect` ar a dtuairimí.