• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak wysyłać tokeny CSRF za pomocą Ajax'a oraz PHP.

Object Storage Arubacloud
0 głosów
353 wizyt
pytanie zadane 5 lipca 2019 w PHP przez nielotweb Bywalec (2,240 p.)
zamknięte 5 lipca 2019 przez nielotweb

Cześć,

Ostatnio stworzyłem alert (info o cookies), działał on normalnie.. tzn. gdy nowy użytkownik wchodzi na stronę, wyskakuję mu alert zamyka go 'iksem', i odrazu wysyłam wiadomość do PHP za pomocą ajax'a i PHP tworzy odpowiedni cookie.

Problem w tym że zaimplementowałem do strony CSRF protection i teraz gdy dane się wysyłają po kliknięciu X, wywala response 404 valid csrf.. co jest logiczne. Ale mam problem z wysłaniem owego csrf za pomocą ajaxa.

Próbowałem zrobić takie coś (znalazłem jakiś randomowy poradnik na necie)

<!-- CSRF Tokens -->
<div class="js-csrf-token" style="display:none;" data-csrf-token-name="X-{{ csrf_name() }}" data-csrf-token-value="{{ csrf_token() }}"></div>

<!-- Accept cookies by user -->
<script type="text/javascript">
    function getCsrfToken() {
        const csrfTokenNode = document.getElementsByClassName('js-csrf-token')[0];

        return {
            name: csrfTokenNode.getAttribute('data-csrf-token-name'),
            value: csrfTokenNode.getAttribute('data-csrf-token-value')
        }
    }
    console.log(getCsrfToken());
    const csrfToken = getCsrfToken();

    $(function () {
        $(".uk-alert-close").on("click", function(e) {
            $.ajax({
                url: '{{ base_url() }}/cookies/info',
                method : "POST",
                cache: false,
                dataType : "xml",
                beforeSend: function(request) {
                    request.setRequestHeader(csrfToken.name, csrfToken.value);
                },
                data : {
                    accept:  true
                }
            })
                .done(function() {
                })
                .always(function() {
                });
        });
    });
</script>

I pomysł był taki żeby wysłać to jako Header requestu ajaxa (?), no i to nie działa.. w sensie gdy sprawdzam header i jego zawartość się wysyła, działa, ale nadal wywala response z valid csrf.

Ogólnie bym potrafił do zrobić, ale nie do końca wiem na czym polega wysyłanie tych tokenów i jak one działają. Ma ktoś jakiś pomysł jak to mogę zaimplementować żeby przez Ajax'a (i jQuery) mogę to wysłać?

A i dodam że csrf zaimportowałem od slim'a bo stronę właśnie robię w slim'ie (php).

Z góry dziękuję!

komentarz zamknięcia: Dobra nieważne, rozwiązaniem było nie wysłanie tego jako header request'u, a jako zwykła data.
komentarz 5 lipca 2019 przez nielotweb Bywalec (2,240 p.)
Dobra nieważne, rozwiązaniem było nie wysłanie tego jako header request'u, a jako zwykła data.
1
komentarz 5 lipca 2019 przez Chess Szeryf (76,710 p.)

Tłumaczenie ja i trochę translate google.

Metoda XMLHttpRequest - setRequestHeader() ustawia wartość z żądania nagłówka HTTP. Podczas używania setRequestHeader() musisz wywołać to po wywołaniu open(), ale przed wywołaniem send(). Jeśli ta metoda jest wywołana kilka razy z tym samym nagłówkiem, wartości są scalane w jedno pojedyczne żądanie nagłówka.

Za każdym razem, gdy wywołujesz setRequestHeader() po pierwszym wywołaniu tego, określony tekst jest doczepiany na koniec już istniejącej zawartości nagłówka.

Jeśli nagłówek Accept nie zostanie ustawiony używając tego, nagłówek Accept z typem "*/*" zostanie wysłany z żądaniem kiedy zostanie wywołany send().


Dla powodów bezpieczeństwa, niektóre nagłówki mogą tylko być kontrolowane przez user agent. Te nagłówki zawierają forbidden header names i forbidden response header names.

Wzmianka: Dla twoich niestandardowych pól, możesz napotkać "not allowed by Access-Control-Allow-Headers in preflight response" wyjątek kiedy wyślesz żądania przez domeny. W tej sytuacji potrzebujesz ustawić Access-Control-Allow-Headers w swoim zwracanym nagłówku po stronie serwera.

Składnia

XMLHttpRequest.setRequestHeader(header, value)

Parametry

header - Nazwa nagłówka którego wartość ma być ustawiona.

value - Wartość do ustawienia jako ciała nagłówka.

Return value

undefined.

Podobne pytania

0 głosów
1 odpowiedź 245 wizyt
pytanie zadane 19 maja 2017 w PHP przez Dani7778 Użytkownik (550 p.)
0 głosów
1 odpowiedź 627 wizyt
pytanie zadane 23 listopada 2018 w Bezpieczeństwo, hacking przez Adrian1999 Nałogowiec (34,570 p.)
0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 27 listopada 2017 w PHP przez idgu Nowicjusz (140 p.)

92,570 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...