Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[jQuery] Wysyłanie POST-em tablicy



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> ECMAScript
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5836
Skąd: From Alex Stadt

PostWysłany: Pią Lis 07, 2014 11:48 am  OP    Temat postu: [jQuery] Wysyłanie POST-em tablicy Odpowiedz z cytatem Pisownia

Przetrzepałem 4/3 internetów i nie mogę znaleźć odpowiedzi, mimo że wyników multum. Żaden mi nie działa.
Mam w tablicy javascriptu numery seryjne produktów. W skrypcie PHP mam prostą obsługę tego:
Kod:
            if (isset($_REQUEST['packedSerials']))
            {
                $res=$con->query('SELECT @IDENTITY AS newId');
                $res=$res->fetch_assoc();
                $super=$res['newId'];
                foreach ($_REQUEST['packedSerials'] as $lp=>$serial)
                    $con->query('INSERT INTO MGSerial (super,lp,serial) (?,?,?)',array($super,$lp,$serial));
            }

natomiast nie mogę zmusić jQuery, żeby mi to wysłał (wg Live HTTP Headers wysyła resztę parametrów POZA tym).
Próbowałem na różne sposoby:
Kod:
$.ajax({'type':'POST','url':'request.php','data':{'action':'Packed','idDk':WZList.selected.userData,'packedSerials[]':packedSerials},'async':false});

Kod:
$.ajax({'type':'POST','url':'request.php','data':{'action':'Packed','idDk':WZList.selected.userData,'packedSerials':packedSerials},'async':false});

Kod:
$.ajax({'type':'POST','url':'request.php','data':{'action':'Packed','idDk':WZList.selected.userData,packedSerials:packedSerials},'async':false});

paru innych i ciągle nic. Ma ktoś jakiś sprawdzony kawałek kodu?

_________________
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
Luke



Dołączył: 17 Cze 2007
Posty: 1888
Skąd: Szczecin

PostWysłany: Nie Lis 09, 2014 8:54 pm      Temat postu: Odpowiedz z cytatem Pisownia

Czemu korzystasz z $_REQUEST a nie z $_POST? Narażasz się na to, że ktoś prześle dane GET-em, a nawet się nie spostrzegniesz. :)

"Nie wysyła" - czyli nie idzie żądanie? Konsola rzuca jakieś błędy?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
mikmas



Dołączył: 26 Maj 2005
Posty: 5836
Skąd: From Alex Stadt

PostWysłany: Sro Lis 12, 2014 6:10 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Z tym GET-em - wiem o tym. Specjalnie z tego korzystam. Co za różnica, czym mi to podeśle?

Problem rozwiązany. Zaraz po tym słał się drugi ajax bez tego parametru i to mnie myliło. 2 requesty wcześniej ładnie słał.

_________________
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
Luke



Dołączył: 17 Cze 2007
Posty: 1888
Skąd: Szczecin

PostWysłany: Sob Lis 15, 2014 1:23 am      Temat postu: Odpowiedz z cytatem Pisownia

mikmas napisał:
Co za różnica, czym mi to podeśle?

http://pl.wikipedia.org/wiki/Cross-site_request_forgery
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
marcin_an



Dołączył: 26 Maj 2005
Posty: 18813

PostWysłany: Sob Lis 15, 2014 3:10 am      Temat postu: Odpowiedz z cytatem Pisownia

mikmas:
SOA#1
Kod:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        </head>
    <body>
        <div>
            <button id="send">Send</button>
            </div>
        <script type="text/javascript" src="jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $('#send').click(function() {
                $.ajax({
                    url: 'gpcback.php',
                    type: 'POST',
                    data: {
                        action: 'testAction',
                        params: [1, 2, 3]
                    }
                });
            });
            </script>
        </body>
    </html>
gpcback.php:
Kod:
<?php

header('Content-type: text/plain; charset=utf-8');
echo "=== GET ===\n";
var_dump($_GET);
echo "=== POST ===\n";
var_dump($_POST);
echo "=== COOKIE ===\n";
var_dump($_COOKIE);

Wysłane:
Cytat:
action=testAction&params%5B%5D=1&params%5B%5D=2&params%5B%5D=3
Otrzymane:
=== GET ===
array(0) {
}
=== POST ===
array(2) {
["action"]=>
string(10) "testAction"
["params"]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
}
=== COOKIE ===
array(0) {
}
Nie masz jakiejś prehistorycznej wersji jQuery? Oni coś tam w zamierzchłych czasach zmieniali, jeśli chodzi o sposób serializacji obiektów. Jeżeli to nie to, to sprawdź, czy packedSerials ma sens. Bo może wcześniej coś się sypie.


Co do $_REQUEST: powąchaj. Czujesz smród? Powienieneś. I to bez szukania źródła zapachu, bo jeśli je znajdziesz, to zapewne wtedy, gdy w nie wdepniesz.

Jeśli nos ci nie wystarcza i koniecznie chcesz pooglądać zawartość sedesów, to Luke przedstawił ci już jeden dosyć praktyczny problem. Używanie wprost $_POST nie chroni przed CSRF. Właściwym rozwiązaniem są tokeny. Wymuszenie danych z POST stanowi jednak dodatkową, istotną warstwę zabezpieczeń na wypadek, gdyby coś poszło nie tak z tokenami.

$_REQUEST miesza dane z różnych źródeł. Jeżeli część danych dojdzie z GET, a część z POST, to coś nie gra. To "coś nie gra" należy zauważyć i wyeliminować. Jednak używając $_REQUEST dobrowolnie godzisz się na to, że taki błąd pozostanie niewykryty, czyli zapraszasz buga do aplikacji.

Nikt nie spodziewa się tego, że autor kodu po stronie serwera nie myśli, skąd ciągnie dane. Zmienne w GPC mogą się duplikować i nie jest to sytuacja niewłaściwa. W $_REQUEST część z tych danych się ponadpisuje i możesz się mocno zdziwić, gdy dostaniesz coś, czego nie oczekiwałeś. Jeżeli sądzisz, że sytuacja jest hipotetyczna, bo można mieć kontrolę nad całym systemem i wdrożyć tak, żeby nic się nie powtarzało, to cię zmartwię: nad ciasteczkami użytkownika ze starszych wersji aplikacji nie masz kontroli.

Ale $_REQUEST to małe piwo. Czy packedSerials jest ustawione sprawdzasz - ok. A gdzie sprawdzenie, czy jest to tablica? I gdzie walidacja?! Wrzucasz dane z niezaufanego źródła wprost do bazy danych... gratulacje. Dobrze, że prepared statements załatwia przynajmniej SQLi, bo to zakrawa o horror. Mam nadzieję, że chociaż przy wyświetlaniu tych danych odpowiednio je oczyszczasz, bo jeśl nie, to mamy piękny przykład CSRF+XSS, a przy odrobinie szczęścia także DoS, bo liczby wsadzanych wartości nijak nie ograniczasz.

Wiesz co... pamiętasz, jak nasze drogi się rozeszły? Z bycia pierwszy raz przyłapanym na infekowaniu maszyn w swojej szkole wniosków nie wyciągnąłeś. Zdawało mi się jednak, że po takich zabawach możesz wyciągnąć naukę na temat błędów we własnych aplikacjach. Chyba rzeczywiście tylko mi się zdawało.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5836
Skąd: From Alex Stadt

PostWysłany: Sob Lis 15, 2014 9:22 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Nadal nie kumam co w tym złego, że w $_REQUEST są mieszane dane GET z POST? Haker postara się o plugin do CRUDA i to co wyśle GET-em może wysłać POST-em. Czy to $_POST czy $_GET czy $_REQUEST do danych trza podchodzić jak do ognia. Nie rozumiem, przed czym miałoby uchronić użycie post zamiast get-a
Cytat:
A gdzie sprawdzenie, czy jest to tablica?

Co mogłoby się stać, gdyby nie było? OK, może niezbyt eleganckie i warningiem mogłoby sypnąć, ale bez przesady.

Walidacja - jak najbardziej! Każdy może tam bzdury wpisać. Jednak w tym systemie nic by mu to nie dało. Nr seryjne są tam bardziej informacyjnie.

DoS itepe - ten projekt jest wewnętrzny. Magazynier dostaje wykaz pozycji na WZ, skanuje i w systemie jest zapisywany numer seryjny oraz info, że jest już spakowane. Wszystko w sieci lokalnej, więc pozwoliłem sobie na pewną poufałość. Jeżeli magazynier zapchałby tabelę to nic by tym nie uzyskał. Nieprofesjonalne podejście, bo nie powinienem ufać nawet sobie, jednak jest kilka faktów, które mnie tu usprawiedliwiają ;).


Ale jak nie kumałem z tym request tak nie kumam nadal, o co chodzi

_________________
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> ECMAScript Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.02626 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |