[PHP] Securizarea datelor in POST si GET cu functii default

Discutii despre tot ce nu se incadreaza in celelalte categorii.

Moderators: Moderatori ajutatori, Moderatori

User avatar
noMadz
Membru, skill +1
Membru, skill +1
Posts: 214
Joined: 18 Mar 2012, 14:22
Detinator Steam: Da
CS Status: retired.
Reputatie: Ban 3 luni
Location: #!/bin/bash
Has thanked: 2 times
Been thanked: 34 times

08 Aug 2012, 22:23

Sper sa ajute pe cineva, avand in vedere ca baietii de la http://gtracker.net si-au cam luat-o. (imi pare rau, pana nu te frigi nu te inveti, nu?).

PHP este un limbaj de programare si html este un limbaj grafic. Diferenta este ca PHP opereaza in server-side, in timp de html opereaza user-side. De asemenea php contine functii de prelucrare si modificare ale continutului, in timp ce html se bazeaza pe afisarea acestuia.

Comunicarea intre utilizator si scriptul php se realizeaza prin intermediarul html, mai exact prin forms. Exista doua tipuri de forms in html, si anume GET si POST. Transmiterea prin GET este greoaie si se realizeaza prin intermediul url-ului, datele fiind restrictionate la un sir de 255 caractere, in timp ce prin post datele au o lungime practic nelimitata, ele fiind transmise prin curenta conexiune html. La accesarea butonului submit al formei html suntem adusi pe pagina specificata prin identificatorul target. Datele transmise prin POST sau GET sunt preluate de catre php prin urmatoare sintaxa:

Code: Select all

<?php
$variabila1=$_POST['identificator'];
$variabila2=$_GET['identificator2'];
?>
Atentie: Aceste variabile sunt stocate numai la o singura rulare a scriptului. La un simplu refresh datele sunt pierdute iremediabil..
Probleme apar cand prin intermediul acestor variabile este stocat continut in baza de date pentru afisare ulterioara pe site, mentinerea unei evidente etc. Caracterele speciale nu se impaca bine cu MySQL si, din aceasta cauza, pot aparea erori de procesare, de sintaxa, probleme in afisarea codului html. Pentru evitarea acestor probleme si, in concluzie, pentru evitarea problemelor de tip Injectie SQL, inectie XSS este necesara filtrarea continutului preluat de la utilizator. Php pune la dispozitie un numar destul de mare de functii care au rolul de protejare si eliminare a caracterelor speciale.

Dintre acestea amintim:

Code: Select all

htmlspecialchars(); //functie de baza, elimina toate caractere nedorite.
FILTER_SANITIZE_EMAIL(); //functie filtrare camp, folosita pentru emailuri.
FILTER_SANITIZE_URL(); //functie filtrare url.
Pentru mai multe functii rog a se vedea: http://php.net/manual/en

Folosirea functiilor:
Functiile citate mai sus se aplica unei variabile sau pot merge direct cu functiile $_GET si $_POST, cum urmeaza:

Code: Select all

<?php
$var1=htmlspecialchars($_POST['identificator']);
?>
Idem si pentru $_GET. Aveti grija cum folositi php ca sa nu deveniti din admini simple victime. Stay safe! Pentru nelamuriri rog lasati topicul deschis:)
Romanii ar pleca vara cu sania, ar face tot doar ca s-ajunga in Spania.
RoyalServer
The Kalu
Fost administrator
Fost administrator
Posts: 13707
Joined: 09 Oct 2010, 12:39
Detinator Steam: Da
CS Status: In grajd!
SteamID: kalulord
Reputatie: Fost Administrator
Fost membru Club eXtreamCS (6 luni)
Nume anterior: Terra
Location: Romania, Ploiesti
Has thanked: 328 times
Been thanked: 646 times
Contact:

08 Aug 2012, 22:38

XSS aa?:D
Image
User avatar
fan_haulin
Fost moderator
Fost moderator
Posts: 2592
Joined: 08 Jun 2010, 20:35
Detinator Steam: Da
Reputatie: Fost Moderator
Has thanked: 271 times
Been thanked: 106 times
Contact:

08 Aug 2012, 22:52

Lol. Mersi ca m-ati anuntat sa-l fac iar...

@xdc se lauda ca a reparat XSS . halal :-j

EDIT: Bine ca am aflat ce fraier a facut asta >:)

In 24 h o sa fie off blog-ul.
Last edited by Mafios_X on 08 Aug 2012, 23:25, edited 1 time in total.
Reason: Ai primit avertisment pentru atac la persoana.
User avatar
noMadz
Membru, skill +1
Membru, skill +1
Posts: 214
Joined: 18 Mar 2012, 14:22
Detinator Steam: Da
CS Status: retired.
Reputatie: Ban 3 luni
Location: #!/bin/bash
Has thanked: 2 times
Been thanked: 34 times

08 Aug 2012, 23:00

:)Nu ar trebui sa ameninti cand ai putea sa ceri un sfat.
Fraier esti, pentru ca nu ai habar php si operezi site-ul, adminule care esti tu admin.

Nu trebuie sa refaci nimic, doar stergi din dbase entry-urile cu cod malitios si securizezi formele.
Romanii ar pleca vara cu sania, ar face tot doar ca s-ajunga in Spania.
User avatar
GPaul
Membru, skill +4
Membru, skill +4
Posts: 1931
Joined: 21 Mar 2009, 12:14
Detinator Steam: Da
CS Status: Inactiv. Studiu intens.
Detinator server CS: - House M.D -
SteamID: - House M.D -
Reputatie: Nume anterior: djxpaulz
Fost super moderator
Location: Cluj-Napoca
Has thanked: 8 times
Been thanked: 174 times
Contact:

08 Aug 2012, 23:19

fan_haulin wrote:Lol. Mersi ca m-ati anuntat sa-l fac iar...

@xdc se lauda ca a reparat XSS . halal :-j

EDIT: Bine ca am aflat ce fraier a facut asta >:)

In 24 h o sa fie off blog-ul.
Tanara speranta, termina cu amenintarile, esti patetic.

Merci pentru functii, cum sunt la inceput cu php-ul am facut alte functii folosti str_replace. Merci frumos.
Image
Image
User avatar
Raduk
Membru, skill +1
Membru, skill +1
Posts: 246
Joined: 29 Nov 2008, 08:26
Detinator Steam: Da
Location: Brasov
Has thanked: 12 times
Been thanked: 31 times

09 Aug 2012, 01:07

Echivalent cu htmlspecialchars avem functia htmlentities, am vazut ca asta e mai folosita (doar ca scriere, caci ele fac acelasi lucru). Cat despre FILTER_SANITIZE_ sunt 4 sau 5 functii in afara de cele spuse de tine. Mai sunt pentru verificarea unui URL sau a unui IP dar pentru altele putem folosi expresii regulate:

Code: Select all

http://www.youtube.com/playlist?list=52B466FB631CD514
O continuare a ceea ce ai inceput tu gasesti aici:

Code: Select all

http://www.youtube.com/playlist?list=5F8BFE541D972472
User avatar
noMadz
Membru, skill +1
Membru, skill +1
Posts: 214
Joined: 18 Mar 2012, 14:22
Detinator Steam: Da
CS Status: retired.
Reputatie: Ban 3 luni
Location: #!/bin/bash
Has thanked: 2 times
Been thanked: 34 times

09 Aug 2012, 12:02

@Raduk: Am specificat ca mai exista si alte functii, dar multumesc pentru completari.
Romanii ar pleca vara cu sania, ar face tot doar ca s-ajunga in Spania.
vim
Programator eXtream
Programator eXtream
Posts: 853
Joined: 29 May 2009, 19:13
Detinator Steam: Da
CS Status: Trag cu praştia !
Reputatie: Fost programator web eXtreamCS
Administrator tehnic
Sysadmin
Location: Bucureşti
Has thanked: 2 times
Been thanked: 342 times

09 Aug 2012, 18:16

noMadz wrote:html este un limbaj grafic.
Markup, nu grafic.

noMadz wrote:Comunicarea intre utilizator si scriptul php se realizeaza prin intermediarul html, mai exact prin forms.
Te contrazici singur. Mai devreme ziceai ca HTML se ocupa doar cu afisarea continutului unei pagini si acum zici ca HTML este un intermediar folosit in transport. De fapt comunicarea se face prin intermediul HTTP, desi nu este o regula (vezi socket).
noMadz wrote:Exista doua tipuri de forms in html, si anume GET si POST.
_GET si _POST sunt array-uri superglobale in PHP, care contin variabilele transmise prin metodele HTTP POST, respectiv HTTP GET si nu depind cu nimic de formularele din HTML. Asadar GET si POST sunt metode ale protocolului HTTP, definite inca din versiunea 1.0 (vezi RFC 1945), iar in versiunea 1.1 a protocolului HTTP au mai fost adaugate inca 5 metode noi: Options, Put, Delete, Trace si Connect.
noMadz wrote:Transmiterea prin GET este greoaie si se realizeaza prin intermediul url-ului, datele fiind restrictionate la un sir de 255 caractere
Ce te face sa spui ca este greoaie ? Standardul HTTP specifica ca metoda GET este recomandat sa fie pastrata sub 255 de biti, dar nu este ceva impus. Drept dovada ca fiecare browser are o limitare intre 2KB si 8KB. In plus de asta recomandarea ca cineva sa utilizeze POST mai des decat GET este o prostie pentru ca incalca definitia din standardul HTTP. GET este folosit cand vrei sa primesti date de la server si POST cand vrei sa trimiti date catre server. Mai exista si cazuri speciale cand esti nevoit sa te abati de la standard, dar este recomandat sa se intample cat mai rar acest lucru, mai ales cand este vorba de scrierea unui API.
  • La adaugarea unei noi intrari in DB faci POST, pentru ca trimiti date pentru salvare.
  • La o functie de cautare folosesti GET, pentru ca primesti date.
noMadz wrote:in timp ce prin post datele au o lungime practic nelimitata, ele fiind transmise prin curenta conexiune html.
Conexiunea este facuta prin intermediul HTTP, nu al HTML-ului.

noMadz wrote:Atentie: Aceste variabile sunt stocate numai la o singura rulare a scriptului. La un simplu refresh datele sunt pierdute iremediabil..
Nu este obligatoriu. Daca specifici in cod ca doresti ca respectiva cerere POST/GET sa fie inaintata catre alta destinatie, o poti face specificand codul HTTP 307, care inseamna "Temporary Redirect" si este inteles de orice browser modern. Astfel browser-ul va reface cererea POST/GET anterioara si o va trimite catre noua adresa.

Un exemplu elocvent:

Code: Select all

Formular -> Destinatie #1 -> Destinatie #2
  1. La apasarea butonului "Register" din formular, user-ul este trimis catre "Destinatie #1". Sa ii spunem /register/
  2. Cand user-ul ajunge pe pagina /register/ (Destinatie #1) script-ul descopera ca exista sanse mari ca respectivul user sa fie un robot si trebuie sa ii apara un cod captcha pentru verificare, inainte ca inregistrarea sa fie finalizata. User-ul este redirectionat catre codul captcha (Destinatie #2), pastrand insa si datele specificate in formular-ul de inregistrare:

    Code: Select all

    header('HTTP/1.0 307 Temporary Redirect',$replace=true,307); 
    header('Location: /register/captcha/');  
noMadz wrote:Folosirea functiilor:
Functiile citate mai sus se aplica unei variabile sau pot merge direct cu functiile $_GET si $_POST, cum urmeaza:

Code: Select all

<?php
$var1=htmlspecialchars($_POST['identificator']);
?>
Sau poti curata tot array-ul dintr-o singura miscare:

Code: Select all

array_map("htmlspecialchars", $_GET);
sau recursiv

Code: Select all

array_walk_recursive($_GET, "htmlspecialchars");
I'm not antisocial, I'm just not user friendly.
⎯ retired
User avatar
noMadz
Membru, skill +1
Membru, skill +1
Posts: 214
Joined: 18 Mar 2012, 14:22
Detinator Steam: Da
CS Status: retired.
Reputatie: Ban 3 luni
Location: #!/bin/bash
Has thanked: 2 times
Been thanked: 34 times

09 Aug 2012, 23:27

Multumesc de completari si adaugiri:)
Romanii ar pleca vara cu sania, ar face tot doar ca s-ajunga in Spania.
User avatar
piticanie
Membru, skill +2
Membru, skill +2
Posts: 775
Joined: 23 Jun 2010, 20:04
Detinator Steam: Da
CS Status: PoC !
Detinator server CS: Nu
SteamID: 123456789
Reputatie: Restrictie PM !
Has thanked: 20 times
Been thanked: 76 times
Contact:

10 Aug 2012, 03:02

Sa presupun ca ai luat un scanner de pe rst si ai dat cu havij-ul in site pana n-ai mai putut :) ?
User avatar
IsTI37
Fost administrator
Fost administrator
Posts: 10987
Joined: 10 Apr 2007, 15:02
Detinator Steam: Da
Reputatie: Fost administrator
Fost SysAdmin
Fost Fondator GTA5 (CVL)
Location: Cluj-Napoca
Has thanked: 28 times
Been thanked: 776 times

10 Aug 2012, 03:15

Nu folositi functiile php, e o idee super proasta fiindca nu stiti ce lasati.
Orice framework are functii de securizare testate si usor de folosit.

Daca faceti o aplicatie care va fi utilizata de mai multi oameni apelati neaparat la un framework.
Eu de obicei las fara sanitizare doar un camp care nu permite mai mult de 16 caractere verificat in php. (este imposibil sa adaugi ceva util intr-un spatiu atat de mic)

Prin folosirea PDO sau MySQLi nu aveti cum sa dati de probleme gen sql injection la un camp limitat de spatiu. Daca campul trebuie sa fie foarte mare din ceva motiv phpbb are de exemplu functia request_var care protejeaza input-urile.
User avatar
noMadz
Membru, skill +1
Membru, skill +1
Posts: 214
Joined: 18 Mar 2012, 14:22
Detinator Steam: Da
CS Status: retired.
Reputatie: Ban 3 luni
Location: #!/bin/bash
Has thanked: 2 times
Been thanked: 34 times

10 Aug 2012, 10:16

piticanie wrote:Sa presupun ca ai luat un scanner de pe rst si ai dat cu havij-ul in site pana n-ai mai putut :) ?
Tovarase, lasa atitudinea de printesa. E doar un xss persistent pe care ti-l exploateaza orice persoana cu un dram de cunostinte.
Romanii ar pleca vara cu sania, ar face tot doar ca s-ajunga in Spania.
Post Reply

Return to “Discutii generale”

  • Information
  • Who is online

    Users browsing this forum: Bing [Bot] and 724 guests