MadaLino
Moderator
 Din: Hotel Paradis
Inregistrat: acum 17 ani
Postari: 240
|
|
Câteva idei utile pentru securitatea paginilor web
Regula numărul unu a securităţii online este: nu vă încredeţi niciodată în utilizator. Întotdeauna verificaţi datele trimise către server şi "curăţaţi-le" înainte de a le utiliza. Pentru aceasta trebuie să luaţi în considerare câteva posibile "găuri" de securitate. Menţionez că cele scrise aici sunt doar noţiuni generale, pentru o securitate ridicată ar trebui sa aveţi noţiuni specializate de baze de date şi de administrare a serverelor web.
1. Variabilele globale Având variabilele globale din php.ini setate pe ON puteţi accesa datele trimise prin formulare mai simplu: $variabila în loc de $_GET['variabila'], la fel şi pentru POST sau FILES. Dacă scriptul nu este foarte bine gândit, variabilele globale pot prezenta un risc major de securitate. Din acest motiv php.ini este distribuit cu globals=off în ultimele versiuni.
2. Ghilimele "magice" Dacă în php.ini magic_quotes_gpc sunt OFF folosiţi funcţia addslashes pentru a preceda ghilimelele din datele trimise de utilizatori cu caracterul \. Dacă magic_quotes_gpc sunt ON, PHP adaugă automat caracterul \ înainte de ghilimele dar dacă ele sunt OFF, ghilimelele din input vă pot crea probleme serioase. Ca exemplu, să presupunem că interogarea SQL de verificare a numelui şi a parolei pentru înregistrarea pe site este
SELECT * FROM users WHERE nume='$nume' AND parola='$parola'
şi dacă interogarea este executată cu succes, utilizatorul este logat. În acest caz, folosind parola 'OR' 1=1 oricine poate avea acces pe site deoarece interogarea
SELECT * FROM user WHERE nume='un nume oarecare' AND parola=" OR '1=1'
este executată cu succes şi returnează un rezultat (toate înregistrarile din baza de date, de fapt). Mai mult, atunci când vă aşteptaţi ca baza de date să returneze un singur rând, verificaţi acest lucru şi nu dacă interogarea s-a executat cu succes. Implicit în php.ini magic_quotes_gpc sunt ON pentru a vă proteja de astfel de atacuri, dar este bine să verificaţi înainte de a renunţa la addslashes.
3. Includere Încercaţi să evitaţi includerea "vizibilă" a fişierelor în forma pentru a include fişiere în cadrul unei pagini. Cu puţină neatenţie din partea voastră atacatorul ar putea accesa astfel de informaţii sensibile din cadrul sistemului. Nu includeţi fişiere străine. PHP poate "include" fişiere aflate pe alte servere decât cel care rulează dacă setarea URL fopen wrappers este activată în php.ini. În exemplul de mai sus, un atacator ar fi putut accesa adresa
pentru a include în fisier un script localizat pe alt server şi astfel obţine acces către toate resursele sistemului la care are acces PHP, putând rula comenzi de sistem, afişa informaţii confidenţiale sau sterge baza de date. Nu permiteţi includerea fişierelor din altă parte decât de pe serverul vostru. Setaţi allow_url_fopen=OFF în php.ini.
4. Formulare Folosiţi metoda POST în formulare atunci când informaţia din acestea urmează să fie introdusă în baza de date. Dacă variabilele globale sunt OFF în php.ini sau metoda de transmitere a formularului este GET, un utilizator rău intenţionat ar putea accesa adresa dvs. şi ar introduce comentariul lui (exemplu "blabla" în baza voastră de date fără să treacă propriuzis prin site. Aşa vă puteţi trezi că nu mai aveţi spaţiu pe server iar în baza de date sunt câteva milioane de comentarii care spun acelaşi lucru "blabla". Verificarea provenienţei cererilor către server este foarte importantă şi în alt caz: formularele de loghin. Cineva care ştie numele de utilizator ar putea încerca să vă găsească parola foarte usor. În acest caz va trebui să puneţi o protecţie suplimentară care să nu permită mai mult de X încercări consecutive eşuate de logare pentru un nume de utilizator. Această problemă se rezolva uşor folosind sesiunile. În momentul când cineva încearcă să trimita numele şi parola din formular putem seta o variabilă de sesiune $_SESSION['login_count'] care să ţină minte numărul de încercări. Când valoarea acesteia trece de 3 (încercări nereuşite) nici măcar nu mai interogaţi baza de date pentru a verifica datele trimise. Variabila de sesiune va rămâne în memorie cât timp browserul este deschis şi sesiunea activă (opţiunea implicită a PHP de menţinere a sesiunilor active este de o oră . Dacă atacatorul aşteaptă o ora sau îşi închide browserul, sesiunea va fi închisă şi va putea de alte X ori să se logheze. De cele mai multe ori acestă măsură de siguranta este suficientă pentru a preveni încercările de aflare a parolelor.
5. Extensii O practică obişnuită este de a acorda extensia .inc fişierelor care conţin biblioteci de funcţii ce urmează a fi incluse şi folosite în cod. PHP nu parsează fişierele cu extensia .inc şi dacă acestea sunt apelate direct ele sunt trimise plain text către browser. Nu puneţi informaţii sensibile (precum nume şi parola) în fişiere cu extensia .inc, .txt, sau .html care pot fi accesate şi văzute. Folosiţi pentru aceste fişiere extensia .php care, dacă sunt accesate direct, vor fi rulate fără să afişeze informaţiile conţinute în ele.
6. Comanda CHMOD - setarea atributelor Comanda CHMOD (abreviere pentru change mode permissions of a file) este folosită pentru a schimba modul de acces (de permitere) a fişierelor şi directoarelor de pe server. Setarea poate afecta modul cum poate fi citit, sau cum se poate executa un fişier pe server. De exemplu, dacă aveţi un fişier .php care trebuie să execute o comandă de scriere pe server într-un fişier .txt trebuie să îi daţi dreptul să poata fi executat iar la fişierul .txt trebuie să îi daţi dreptul de a se putea scrie în el. Aveti 3 tipuri de acces - OWNER - GROUP - WORLD - fiecare cu câte 3 setări - READ - WRITE - EXECUTE - Este bine ca la WORLD să nu daţi decât acces la citire (pentru a putea accesa paginile de pe site) dar nu şi drepturi de scriere sau execuţie (pentru că nu doriţi ca oricine să vă scrie ce vrea în respectivul fişier .txt) În programul TOTAL COMMANDER (pe care eu îl folosesc şi pentru FTP) setarea atributelor pe server se face din meniul FILES - CHANGES ATTRIBUTES. Fiecare program de FTP are în meniul lui setare pentru atributele fişierelor de pe server.
7. Cookies Dacă aveţi o secţiune de administrare pe site, unde accesul este restrictionat doar la membrii de exemplu, este bine ca în toate paginile din această secţiune să încludă o pagină de verificare a accesului. Această pagina va verifica la fiecare accesare dacă utilizatorul este înregistrat şi are acces pe pagina respectivă şi permite rularea paginii doar dacă utilizatorul este înregistrat. Fără această verificare, un utilizator ar putea accesa paginile din secţiunea de administrare fără să treacă prin formularul de înregistrare. După autentificarea propriu-zisă, vom folosi variabile de sesiune pentru a păstra în memorie câteva informaţii despre autentificare, pentru a le verifica mai târziu, atunci când accesăm alte pagini din cadrul secţiunii de administrare. Pornim întâi sesiunea după care trecem la salvarea informaţiilor în ea ca în exemplul de mai jos:
session_start(); $_SESSION ['nume_admin'] = $_POST ['nume']; $_SESSION ['parola_encriptata'] = $parolaEncriptata;
Pe lângă acestea, pentru o şi mai mare siguranţă, vom salva id-ul sesiunii în altă variabilă. Toate sesiunile au un id unic, un string care seamănă cu rezultatul unei criptări MD5: $_SESSION ['key_admin'] = session_id(); Cu autentificare făcută, spunem scriptului să încarce prima pagină din secţiunea de administrare:
header ("location: admin.php" ;
În continuare pentru a împiedica accesul neautorizat la paginile din această secţiune, scriem un mic script de verificare a datelor sesiunii înainte de a încărca orice pagină din secţiunea de administrare:
session_start(); if ($_SESSION ['key_admin'] != session_id ()) { print 'Acces neautorizat!'; exit; }
8. Loguri de acces Pentru o verificare ulterioară a persoanelor care încearcă să intre în paginile restrictionate de pe site, este bine să salvăm în baza de date (sau într-un fişier text) numele, parola criptata, ora, data, semnătura browserului şi ip-ul. Aşa veţi ştii cine a încercat să vă spargă site-ul şi puteţi crea un script care sa verifice de exemplu ip-ul şi dacă corespunde cu unul din cele care sunt blocate să nu aibă acces la nici una din pagini (chiar dacă găseşte userul şi parola corecte)
9. Criptarea parolelor cu MD5 Parolele care sunt salvate în baza de date este recomandat să le ţineţi criptate, astfel dacă cineva încearcă să citeasca parolele le va vedea criptate.
INSERT INTO admin VALUES ("administrator", md5("parola" );
Criptarea folosind md5 nu este reversibila (şi astfel nici dvs., nici altcineva nu o va putea afla chiar dacă are acces la baza de date).
10. Pagina index.php în subdirectoare Dacă aveţi mai multe directoare şi subdirectoare pe server este recomandat pentru a preveni accesul la datele aflate în aceste directoare să introduceţi în fiecare director o pagină numită index.html sau index.php care să facă redirectarea automat către pagina principală a site-ului. Astfel minimizati riscul să intre cineva şi să vadă tot ce este în aceste subdirectoare.
11. Fişierul .htaccess Pentru a bloca accesul la un anumit director (sau chiar la tot site-ul) puteti crea un fişier numit .htaccess (cu punct înainte) în care să introduceţi ip-ul care doriţi să îl blocaţi (sau care să aibă acces)
Order Deny,Allow Allow from all
În exemplul de mai sus, toată lumea are acces. Dacă de exemplu ip-ul 192.168.1.1 nu doriţi să aibă acces la acel director scrieţi
Deny from 192.168.1.1
Atenţie, să nu vă blocaţi singuri ip-ul la site, că altfel trebuie să luaţi legătura cu administratorul serverului să steargă fişierul ca să puteţi intra din nou pe site, sau sa scrieti prin FTP un nou fişier .htaccess. (la subdirectoare ştergeţi directorul sau salvaţi un alt fişier .htaccess) În cazul în care după de aţi pus fişierul pe server nu îl vedeţi, el este acolo dar serverul seteaza acest nume de fişier ca fişier ascuns.
12. Roboţii de căutare Motoarele de căutare pot indexa tot ce se află la voi pe site. Dacă doriţi ca un fişier sau director să nu fie indexat de către motoarele de căutare, trebuie să creaţi un fişier numit robots.txt care să se afle în directorul principal de pe site (nu în subdirectoare). În el scrieţi următoarele comenzi:
# robots.txt for User-agent: * Disallow: /cache/ Disallow: /admin disallow: /search
_______________________________________

" Cui nu-i place cum gandesc multa ii doresc ! "

|
|