• 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.

Aruba Cloud - Virtual Private Server VPS
0 głosów
416 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,730 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ź 354 wizyt
pytanie zadane 19 maja 2017 w PHP przez Dani7778 Użytkownik (550 p.)
0 głosów
1 odpowiedź 884 wizyt
pytanie zadane 23 listopada 2018 w Bezpieczeństwo, hacking przez Adrian1999 Nałogowiec (34,570 p.)
0 głosów
1 odpowiedź 316 wizyt
pytanie zadane 27 listopada 2017 w PHP przez idgu Nowicjusz (140 p.)

93,277 zapytań

142,276 odpowiedzi

322,282 komentarzy

62,595 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...