Cum sa previ SQL Injection

SQL injections sunt o vulnerabilitate foarte frecventa in apicatiile de pe internet care folosesc baza de date.

Foarte multi programatori nu sunt constienti ca interogarile SQL pot fi modificate extern, si presupun ca aceste comenzi sunt sigure. Asta presupune ca orice atac SQL va trece de orice masura de control si de securitate existenta pe site, si de orice metoda de autentificare folosita. In plus multi dintre ei se gandesc : Cine va incerca sa imi Hack-uiasca site-ul ? Ce motiv ar avea sa faca asta ?

Direct SQL Command Injection este o tehnica prin care un atacator creaza sau modifica o interogare SQL existenta pentru a afla informatii confidentiale, pentru a suprascrie informatii, sau chear pentru a crea noi super useri. Asta se face prin introducerea in input-urile de pe site care sunt folosite in interogariile SQL de comenzi SQL pentru asi realiza scopul propus. Dar destul cu teoria, iata cateva exemple de SQL HAcks care din pacate sunt reale.

Stergerea datelor dintr-un tabel

Acesta este un exemplu de injection, sa consideram un formular de login pe un site care are urmatoarea interogare SQL in codul php:

mysql_query('SELECT * FROM user WHERE username = "' . $_GET['username'] . '");

Un user rau-intentionat poate introduce in input-ul user valoarea ""; DELETE FROM user WHERE 1", care va avea ca efect stergera tuturor userilor din tabel.

SELECT * FROM user WHERE username = ""; DELETE FROM user WHERE 1 ;

Aceasta tip de SQL Injection este posibil sa fie blocat de extensia mysql a PHP-ului care nu permite mai multe interogari mysql in mod defaulst, dar acesta este un exemplu.

Resetarea unei parole / obtinerea de noi privilegii

Se luam acest query relativ siimplu de schimbarea a parolei unui user
$query = "UPDATE user SET password="'.$_GET['password'].'" WHERE id="'.$_GET['user_id'].'" ;

O persoana rau intentionata poate obtine privilegii de admin foarte simplu :
[php]
// user_id == " or username like '%admin%'; --
$query = "UPDATE user SET password='...' WHERE id="" or username like '%admin%'; --";
[/php]

Cum Prevenim SQL injection

E posibil sa crezi ca aceste brese de securitate sunt posibile doar daca atacatorul stie structura bazei de date. Ai dreptate dar, sa nu crezi ca e greu sa afli structura, fiind numeroase cai de a o afla : mesaje de eroare sql printate pe ecran, folosirea unui script open source, si chear simpla incercare a mai multor variante fiind cunoscut faptul ca multi programatori folosesc aceleasi denumiri ( sau destul de apropiate ) pentru nume de tabele si campuri.

Iata un exemplu de atac SQL pentru a ghicii numele unui tabel :
[sql]
SELECT ... FROM table WHERE id = '$user_id';
SELECT ... FROM table WHERE id = '' AND 1=(SELECT COUNT(*) FROM tabname); --';
[/sql]
Dupa cateva incercari, inlocund tabname cu diferite variante atacatorul va gasi un nume de tabel valid.

Pentru a preveni aceste atacuri primul pas este sa construiti aplicatia luand in calcul si posibilitatea unui atac. Iata si cateva metode de prevenire a atacurilor SQL:

  • Nu va conectati niciodata la baza de date SQl cu un super user. Incercati sa limitati privilegiile userului pe care il folositi la conectare la minum posibil.
  • Intodeauna verificati daca input-urile de la useri sunt ceea ce va asteptati sa fie. Folositi functiile php de validare ( ex: is_numeric() ) sau chiar si validare folosind expresii regulate ( regexp ) .
  • Transformati orice camp in tipul pe care il asteptati:
    [php]
    settype($offset, 'integer');
    $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
    // please note %d in the format string, using %s would be meaningless
    $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
    $offset);
    [/php]
  • Limitati numarul de caractere in input-urile userilor. Desi nu va impiedica toate atacurile SQL va oprii o mica parte din ele :)
  • Nu printati pe ecran mersajele de eroare SQL, tineti minte ca am vorbit si mai sus de riscul ca atacatorul sa afle structura DB din aceste mesaje..
  • Si un exemplu de "Best Practice" SQL direct din manualul PHP :
    [php]
    // Quote variable to make safe
    function quote_smart($value)
    {
    // Stripslashes
    if (get_magic_quotes_gpc()) {
    $value = stripslashes($value);
    }
    // Quote if not integer
    if (!is_numeric($value)) {
    $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
    }// Connect
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
    OR die(mysql_error());// Make a safe query
    $query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
    quote_smart($_POST['username']),
    quote_smart($_POST['password']));
    mysql_query($query);
    [/php]

Sper ca acest articol va deschis apetitul si veti incepe sa va protejati aplicatiile web.


Transfer cont WHM/cPanel pe un alt server

Vine si un timp cand o sa gasesti o oferta mai buna pentru hosting si vrei sa iti muti clienti ( conturile ) pe un nou server. Metoda ideala ar fi sa realizezi acest lucru fara sa dai de banuit clientilor ca ai mutat serverul. Deasemenea si a minimiza timpul in care site-urile sa nu functioneze, e-mailurile pierdute si pierderile de date.

Prin acest articol sper sa va ajut sa realizati acest lucru, el este pentru cei care folosesc WHM/Cpanel dar principiile se pot aplica si pentru alte softuri de control panel folosite. Totusi pentru a putea realiza acest lucru aveti nevoie de parola de root a serverului vechi sau de userul si parola clientului.

Primul pas este sa modifici valoare TTL ( Time To Live ) pentru fiecare cont pe care doresti sa il transferi. Pentru a face acest lucru urmareste urmatorii pasi :

1. Click pe Edit DNS zone in sectiunea DNS Functions ( Aceasta gasindu-se in WHM ). Selecteaza contul pe care vrei sa il muti si da click pe butonul de edit .

2. In domain zone vei vedea urmatorul text @ IN 14400 SOA undeva in partea de sus a pagini, acest numar spune serverelor DNS timpul cat aceste setari sunt valabile, in acest caz 4 ore, si pentru ca dorim un updatare cat mai rapida a setarilor vom modifica acesta inregistrare in 3600 adica o ora. Daca nu ati realizat inca :) cifra este in secunde.

3. Aceasi regula se aplica pentru inregistrarea TTL pe care o vei gasi undeva mai jos. Modifica si acesta inregistrare de la 14400 la 3600 deasemenea.

4. Ca sa transmitem serverelor de DNS ca aceste setari sunt noi vom modifica serial number-ul incrementandul cu 1. ( Acest lucru este posibil sa fie facut de WHM in mod automat dar e bine sa il incrementati si voi ca sa fiti siguri )

Dupa ce ati realizat toti pasi de mai sus pentru toate conturile pe care vreti sa le mutati ... puteti lua o bine meritata pauza. In acest timp setarile noi se vor propaga in toate serverele.

Dupa ce au trecut cele patu ore suntem agta sa incepem transferul efectiv. Pentru a realiza acest lucru ne vom loga in WHM pe noul server si in sectiunea transfers vom avea mai multe optiuni pentru a realiza transferul.

Avem o optiune de "Multiple accounts transfer". Aceasta meoda desi este o mai metoda rapida are dezavantajul de a fi mai putin sigura, si are riscul de a pierde date mai ales daca vei transfera site-uri mari cu un volum mare de fisiere/baza de date. Mutand conturile unul cate unul desi va dura mult mai mult va minimiza riscul de a pierde date. In acest articol vom trata aceasta din urma metoda.

Avem 2 optiuni pentru ultima metoda :
1. Prima daca deti parola de root la vechiul server.
2. A doua daca stiu userul si parola clientului

Dupa ce te decizi ce metoda sa folosesti si ai datele ( user si parola ) la indemana putem incepe transferul :
1. Primul pas este sa determini ce fel de site este static ( fisiere HTML ) sau dinamic ( foloseste baze de date ). Daca vobim de un site dinamic va trebui sa inchizi serverul de baza de date pentru o ora cat va dura transferul. Motivul din spatele acestei actiuni este ca nu dorim ca in timp ce facem transferul baza de date de pe vechiul server sa fie modificata si acete modificari sa nu apara pe noul server.

2. Acum selecteaza optiunea pe care te-ai decis sa o folosesti si complecteaza in formularul aparut adresa de ip a vechiului server, username-ul si parola. Deasemenea trebuie bifata daca vrei sa dai o adresa de ip noului cont sau nu. Dupa toate aste da click pe butonul setup.
Serverul va incepe sa preia datele de pe vechiul server prin FTP impartind informatia ( fisiere, baza de date ) in pachete.
ATENTIE !! In timpul acestei operatiuni nu apasa pe butoanele de stop,back sau refresh ale browserului deoarece acest lucru va cauza pierderi de informatii din noul cont pe care il creati.

3. Urmatorul pas presupune sa mergem la Edit DNS Zone din nou ( dar pe noul server de data asta ), selectateaza noul cont si da click pe butonul de edit, si schimbati informatiile de la nameservere ca ele sa reflecte namserverele tale si nu cele default, modifica serial number-ul si da click pe save.

4. Acest pas va realiza redirectarea din DNS a site-ului de pe vechiul server pe cel nou. Mergi la Edit DNS Zone pe vechiul server si schimba toate adresele de ip din adresa serverului vechi in adresa serverului nou, incrementeaza serialul si click pe save.

Si ai transferat on cont. In aproximativ o ora acesta va functiona pe noul server.Repeta toti pasi pentru toate conturile pe care vrei sa le transferi.

Dupa ce ai transferat toate conturile mai ai un singur lucru de facut, trebuie sa mergi la register-ul pentru domeniul care are ns-urile tale si sa modifici adresa de ip catre noul server.

Cam asta a fost totul. In felul asta o sa ai toate conturile transferate si functionale inainte de a avea namserverele propagate complet.

Sper ca acest articol ti-a fost util si astep comentariile voastre.


Cea mai cunoscuta melodie romaneasca

Cea mai cunoscuta melodie romaneasca. E interesant cum prostia poate sa se propage asa de repede in lume, cum tot ce inseamna imagine proasta pentru Romania ( furturi,hacking, romi ) poate sa aibe un succes asa de mare la publicul din toata lumea si adevaratele valori ale Romaniei ( care intradevar sunt cam pe cale de disparitie ) traiesc intr-un anonimat pe meleagurile mioritice.


Neseriozitate la American Experience

din nou firma american experience se tine de renumele sau.

Anul trecut sm plecat cu ei ... si dupa cateva inceidente minore care nu au rosul sa le mai mentionez .. am ajuns un state ... unde surpriza ... jobul pe care mi l-au promis in Romania nu mai era. Am plecat din romania pentru houseman la un hotel din florida in schimb am ajuns sa fiu aproape de sclav la un contractor ... stiu ca suna dur, dar iata situatia mea :
- lucram pentru un contractor care m-a plasat la un restaurant unde a spus ca o sa primesc doar tips, care erau in medie de 40$/zi, mai tarziu am aflat ca el lua 7$/ora de la restaurant pentru mine
- plateam 360$/luna pentru o casa in care statea 16 oameni, 4 in camera
- dormeam 4 ore pe noapte ... drumul inainte si de la servici dura cam 1 ora si 20 de min dus si la fel la intors ... plus un 2 ore de asteptat contractorul sa vina sa ne ia in fiecare seara
- dormeam pe saltele de aer
- plateam 200$/luna la trasport cu o dubita

astfel timp de o luna am castigat destul de mult cat sa raman fara nici un ban.

Raspunsul celor de la american experience dupa ce le-am trimis un mail cu situatia mea :
"Trimite-ne mai multe detalii " ????
ce detalii vreti ... inaltimea saltelei ????

Anul asta printr-o introsatura a sorti am ajuns din nou la ei ... de data asta cu self placement ... sperand ca de data asta "profesionalismul" lor nu ma va putea afecta. Si m-am inselat inca o data.

Am bilet de avion deja platit pe data de 11 iunie.
si ei inca nu m-au programat la ambasada. urmatoarea data cand voi putea merge daca se tin de cuvant ar fi 8 iunie ... deci oricum nu voi putea sa plec pentru ca trebuie sa astept pasaportul.

Managerul restaurantului unde am contractul imi va da postul altcuiva daca nu ajung pana pe data de 14 iunie ... si casa pe care o are pentru angajati.

Asa ca felicitari AMERICAN EXPERIENCE .... o dati din rau in mai rau. Si ne vedem la prezentarea de anul viitor.

Voi fi tipul din primul rand care nu va va lasa sa va tineti prezentarea.

<strong>Later Update ( 14 iunie 2007 ) :</strong>
Dupa lupte seculare mi-a ajuns si DS-ul din america, probabil l-au trimis prin cineva care facea inconjurul lumii pe jos, defapt si asa cred ca ajungea mai repede.
Am pierdut normal biletul ala de avion, a trebuit sa mai dau 200$ ca sa imi modific data plecarii de pe bilet, jobul o sa vad cand ajung acolo ce mai e si cu el, de casa ... ce sa zic, am auzit ca la Walmart corturile sunt ieftine ;).

Sunt programat la ambasada pe 22 iunie si plec pe 27, sper sa reusesc sa recuperez cumva timpul pierdut.
Insa sunt decis ca la anul sa strang destule semnaturi ale studentilor pentru a convinge decanul facultatii sa nu aprobe prezentarea AE in facultatea mea.

Din curiozitate am dat un search pe google dupa work &amp; travel forum. Si rezultatele au fost destul de consecvente, peste tot probleme cu acest program, si ce e si mai interesant in proportie de 100% ( poate exagerez, dar asta e valabil la ce am gasit eu ) firma responsabila a fost AE. Tot felul de probleme :
- intarzieri cu DS-ul
- probleme cu jobul
- persoane care au plati pentru special si nu mai au jobul pentru care au aplicat, si au fost mutati in alta locatie la mama naibii.
- o persoana a avut de 3 ori gresit DS-ul, ultima oara fiind o litera din nume , i din a in loc de i din i, si neavand timp sa mai astepte alt DS a mers asa la ambasada.

Speranta mea e ca aceste probleme sa fie "promovate" mai departe de victimile AE. si poate la anul voi gasi pe forumuri alte probleme gen : cum o sa ma distrez cat mai bine in State

SPOR