Help: HTTP(S)

Marius '95

troubleShooter
Deci HELP!!!

<explicatia_lunga>
In Romania exista o organizatie monopolista numita Renar care este singurul furnizor de servicii de acreditare ISO. Renuntarea la serviciile ei este imposibila. Serviciul de care beneficiaza toate laboratoarele de analize medicale, inclusiv cel in care lucrez, este acreditarea ISO15189. Una dintre cerintele obligatorii ale acelui standard este participarea la control extern al calitatii. Acel control extern are ca finalitate obtinerea unor numere care indica calitatea rezultatelor obtinute in laboratorul participant. Laboratorul in care lucrez a participat la control extern si avem aprox. 1000 de astfel de seturi de numere.

Pana acum, rezultatele controlului extern trebuiau completate intr-un tabel Excel, cate o linie cu fiecare rezultat, adica: data participarii, data primirii rezultatului, numele schemei de control, furnizorul, numele analizei, valoarea raportata, valoarea corecta, scorul Z (indicator al calitatii), etc. Tabelul se trimitea la Renar.

Aceste date le primim in cate un raport PDF din care am reusit sa extrag toate datele relevante si sa completez automat acel tabel, spre deosebire de restul colegilor de suferinta care il completeaza manual.

In infinita lor intelepciune si cu multa durere in cot despre la cat ne dau de munca, Renar ne cere acum sa completam toate datele intr-un formular online facut exclusiv cu jquery si accesat prin HTTPS. Repet, am 1000 de randuri in acel Excel care trebuie introduse in formularul online.
</explicatia_lunga>



<explicatia_scurta>
Am 1000 de randuri de date care trebuie completate intr-un formular HTTPS + jquery.
</explicatia_scurta>

Cum fac:
1) sa decriptez conexiunile HTTPS ale browserului astfel incat sa vad cum anume sunt trimise datele din acel formular si sa replic acele jquery cu datele mele?
sau
2) sa completez automat datele in formularul din browser (jquery, javascript la greu!) ?
 
HTTPS e un protocol de transfer de date, nu are legătură faptul că e HTTPS cu formularul. La tine în browser e decriptat tot, te poți uita fără probleme cu orice plugin care face sniffing.

Eu aș folosi Selenium.
 
Selenium pare foarte foarte complex.
Nu stiam ca exista plugin-uri pentru sniffing. Arunc o privire intai la astea.

PS: A reusit cineva sa uploadeze date pe un site care foloseste formulare cu jquery folosind altceva decat respectivele formulare?
 
Pentru firefox vezi Tamper Data.

De obicei dacă folosești jquery trimiți datele către server ca json, adică e simplu de înțeles ce-i acolo. Dar nu cred că se trimit la fiecare apăsare de buton, ci se strânge un calup la sfârșit. Pe ăla trebuie să-l interpretezi, și pe urmă le poți trimite cu curl.
 
N-am folosit niciodata jquery si json, nici javascript in general.
Formularul este oribil.
Apesi un "+" si apare o linie noua unde campurile au toate un indicativ care nu stiu de unde apare... Nu exista "input" in sensul de formular. Apesi pe camp si se deschide un popup unde scrii intr-un textarea sau calendar care apare acolo. Apesi "ok", popup-ul se inchide si valoarea sau data apare in campul din tabel. Apoi iar apesi "+" sa apara o linie noua.
 
Dacă ești 100% sigur că nu se folosește un html form da, e mai nasol. Până la urmă poți identifica js-urile care se apelează pentru trimiterea la server, doar că durează. La o interfață mai complexă durează mai mult, la una mai simplă mai puțin, asta e.

JSON e doar o prostie de formatare/organizare a datelor, dacă te uiți pe exemplul de pe wikipedia înțelegi 90% din idee și poți s-o aplici în câteva minute. Ar merita văzut dacă nu se trimite tot calupul de date odată, pentru că eu mă aștept ca asta să se întâmple (nimeni normal la cap nu face formulare dinamice cu requests către backend la fiecare click, se spânzură serverul).

Aș schimba titlul thread-ului în "Help: Completare formular HTML dinamic", pentru că HTTP(s) e cea mai mică problemă a ta de fapt.
 
Last edited:
nimeni normal la cap nu face formulare dinamice cu requests către backend la fiecare click, se spânzură serverul

Nu subestima dobitocenia unor developeri pentru proiecte cu o entitate monopol. Plus că și suportul trebuoe să mănânce o pâine.
 
Developerii ăia folosesc de obicei un framework, iar 90% din framework-uri sunt acum complet magice pentru dobitoci, așa că e greu să se bage să strice ceva. Nu zic că nu mai sunt d-ăia cu not invented here din care rezultă lucruri groaznice, dar sunt din ce în ce mai puțini. Până și multe din framework-urile enterprise curente sunt ok-ish, pentru că-s bazate pe proiecte open source cu nume un pic diferite.
 
M-am bagat un pic prin formular. Apare ceva transfer dupa fiecare click si deci cred ca se transmite bucata cu bucata. Also, daca inchid formularul fara sa apas asa-zisul "submit" de la sfarsit, cand il deschid din nou apare cum l-am lasat, inclusiv cu randurile adaugate dar necompletate (goale) in el.

Am trimis mail la admin, sa vedem daca nu cumva e dispus sa accepte si CSV-uri.

Dupa ce am cautat o ora plugin Opera pentru captura HTTPS, descopar ca Opera Dragonfly face direct chestia asta. :eek:
Asadar, in urma capturii din browser:

Adaug data primirii rezultatelor:
Code:
POST /PT/data/pts HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.15
Host: contulmeu.renar.ro
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Referer: https://contulmeu.renar.ro/PT/39969/update/591
Cookie: dancer.session=<censored>; __utma=131527180.1862123490.1397466701.1447666453.1448353194.9; __utmz=131527180.1444721200.6.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection: Keep-Alive
Content-Length: 35
DNT: 1
Accept: */*
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

name=r_date&value=2015-11-02&pk=591

HTTP/1.1 200 OK
Date: Tue, 24 Nov 2015 13:31:03 GMT
Server: Apache/2.2.22 (Debian)
Set-Cookie: dancer.session=<censored>; path=/; HttpOnly
X-Powered-By: Perl Dancer 1.3112
Content-Length: 1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

1
Adaug numele controlului extern:
Code:
POST /PT/data/pts HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.15
Host: contulmeu.renar.ro
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Referer: https://contulmeu.renar.ro/PT/39969/update/591
Cookie: dancer.session=<censored>; __utma=131527180.1862123490.1397466701.1447666453.1448353194.9; __utmz=131527180.1444721200.6.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection: Keep-Alive
Content-Length: 28
DNT: 1
Accept: */*
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

name=scheme&value=abc&pk=591

HTTP/1.1 200 OK
Date: Tue, 24 Nov 2015 13:28:04 GMT
Server: Apache/2.2.22 (Debian)
Set-Cookie: dancer.session=<censored>; path=/; HttpOnly
X-Powered-By: Perl Dancer 1.3112
Content-Length: 1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

1
Adaug rand nou:
Code:
POST /PT/params/new_row HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.15
Host: contulmeu.renar.ro
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Referer: https://contulmeu.renar.ro/PT/39969/update/591
Cookie: dancer.session=<censored>; __utma=131527180.1862123490.1397466701.1447666453.1448353194.9; __utmz=131527180.1444721200.6.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection: Keep-Alive
Content-Length: 14
DNT: 1
Accept: */*
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

domain_id=1399

HTTP/1.1 200 OK
Date: Tue, 24 Nov 2015 13:32:58 GMT
Server: Apache/2.2.22 (Debian)
Set-Cookie: dancer.session=<censored>; path=/; HttpOnly
X-Powered-By: Perl Dancer 1.3112
Content-Length: 1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

1
Adaug domeniu de acreditare nou:
Code:
POST /PT/domains/new_row HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.15
Host: contulmeu.renar.ro
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Referer: https://contulmeu.renar.ro/PT/39969/update/591
Cookie: dancer.session=<censored>; __utma=131527180.1862123490.1397466701.1447666453.1448353194.9; __utmz=131527180.1444721200.6.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection: Keep-Alive
Content-Length: 9
DNT: 1
Accept: */*
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

pt_id=591

HTTP/1.1 200 OK
Date: Tue, 24 Nov 2015 13:33:43 GMT
Server: Apache/2.2.22 (Debian)
Set-Cookie: dancer.session=<censored>; path=/; HttpOnly
X-Powered-By: Perl Dancer 1.3112
Content-Length: 1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

1

Deci pare simplu. Trebuie doar sa mai obtin cookie-ul de sesiune. :biggrin:
 
Mda, deci scriptul merge. Adauga cam un rand la 5 secunde.
As vrea sa mearga mai repede. In prezent deschid cate o conexiune https la serverul Renar pentru fiecare request. Cum fac o conexiune keep-alive pe care sa o refolosesc pentru toate request-urile trimise?

Codul este asa:
Code:
$header = <<<EOD
POST /PT/data/fisier HTTP/1.0
Host: server renar
Accept: text/html
Cookie aici
Connection: Close
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
EOD;

function M95HttpReq($header,$data){
 $conn=fsockopen('tls://server',443,$errno,$err) or exit("\r\nError! Server connection failed. Error was $errno:$err\r\n");unset($errno,$err);
 fputs($conn,$header."\r\n\r\n".$data);unset($header,$data);
 $reply="";
 while(!feof($conn))$reply.=fgets($conn);
 fclose($conn);
 return($reply);

Cum fac astfel incat aceasta functie sa pastreze conexiunea deschisa pe toata durata scriptului?
 
Păi în loc de Connection: Close trebuie să pui Connection: keep-alive, iar POST-ul trebuie să fie HTTP/1.1, dar vezi că serverul nu e obligat să îți respecte cererea (trebuie să te uiți și în răspunsul serverului, să vezi că și el răspunde cu Keep-Alive). Vezi și chunks (sau trebuie să fii atent la content-length-ul trimis de server, ca să știi când s-a terminat response-ul), și mai multe detalii aici.
 
Back
Top