sql injection

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
steell
Mesaje:190

sql injection

salut. 1 as vrea sa-mi explicati mai amanuntit cum functioneaza ( exemplu daca se poate), si cum se poate feri de acest atac sql injection
de exemlu daca am urmatorul cod

Cod: Selectaţi tot

$user=$_POST['user'];
$parola=$_POST['parola'];
....compara user si parola cu cele din tabela mysql
daca sunt corecte echo"parola corecta";
etc intelegeti ce vreau sa zic
cum poate fi atacata baza de date mysql prin formularul respectiv? si cum se poate proteja?
2 ce alte metode de "spargere" a unui site/server web mai exista si cum ma pot proteja de ele?
3 de ce atacuri ati protejat siteul acesta si cum? doresc mai amanuntit va rog vreau sa invat din metodele voastre cum ati facut voi pentru ca aveti experienta si stiu ca ati protejat bine siteului.

claUdiu Mesaje:313
Buna, nu stiu eu multe, dar o sa incerc sa-ti dau un cod:

Cod: Selectaţi tot

mysql_real_escape_string($string)
si

Cod: Selectaţi tot

htmlspecialchars($string)
Nu stiu cum lucreaza aceste atacuri, dar eu mereu cand am urmarit pe youtube videclipuri, si cand face acel utilizator ceva de genu: site.do?pagina.php?id='2 , ii intra in baza de date, dar, la mine nu a mers. Am facut tot ce am vazut, dar tot nu am reusit sa-mi intru in baza de date... (poate o sa-mi spuna si mie MarPlo de ce..)

Deci: ei nu lucreaza doar prin formulare, ci si prin url.

P.S. Poti sa folosesti asta mai bine:

Cod: Selectaţi tot

mysql_real_escape_string(htmlspecialchars($string));
Se spune ca...."omul tot invata in viata". Dar...Totusi...Trebie sa ne oprim undeva, nu?

MarPlo Mesaje:4343
Salut
Nu ma pricep la SQL Injection sau alt gen de "atacuri" web, fiindca nu m-au interesat.
Ca regula, sterg posibile tag-uri ce pot fi trimise prin URL ($_GET) si formular ($_POST), folosind codul:

Cod: Selectaţi tot

$_GET = array_map("strip_tags", $_GET);
$_POST = array_map("strip_tags", $_POST); 
Iar in lucru cu baze de date, folosesc PDO cu prepare() , execute() , care filtreaza automat datele inainte de a fi trimise la serverul bazei de date, sau aplic fnctia mysql_real_escape_string().
Prin filtrare se intelege in special curatirea sau adaugarea caracterului "\" la ghilimele sau simboluri (precum %) care pot adauga instructiuni in sirul SQL.
De exemplu, daca ai Selectul acesta:

Cod: Selectaţi tot

$int=mysql_query("SELECT * FROM users WHERE user='".$_POST['username']."' AND password='".$_POST['password']."'");
 
Dacă utilizatorul poate sa introduca acest sir la password: "' OR ''='" , query-ul va fi:

Cod: Selectaţi tot

SELECT * FROM users WHERE user='nume' AND password='' OR ''=''
ceea ce va face logarea indiferent de user.

Mai multe detalii despre SQL Injection si metode de securizare gasesti la aeste pagini: Atacurile SQL INJECTION si Vulnerabilitati Web si securizarea acestora, sau pe net daca faci cautre dupa: "protectie SQL Injection".

ecautro Mesaje:6
Cel mai bun rezultat se poate obtine prin filtrarea caracterelor alfa numerice

Cod: Selectaţi tot

$rezultat = preg_replace("/[^a-zA-Z0-9\s]/", "", $_POST['username']);
rezultatul va contine doar caractere intre a si z , A si Z , 0 si 9 inclusiv spatiu(whitespace)

steell Mesaje:190
salut deci am un formular ce contine un camp nume. atunci cand dau submit datele din form se scriu intr-o baza de date apoi se afiseaza in pagina "datele au fost scrise cu succes pentru nume:.$nume (mai sus am $nume=$_POST['nume'] )
acum revenim la sql injection, eu folosesc wamp si nu reusesc sa injectez nimic in formular, de exemplu cand introduc ghilimele " se scrie in baza de date " si imi afiseaza in pagina datele au fost scrise cu succes pentru nume \".
imi adauga automat un backslash desi eu nu am pus $nume=mysql_real_escape_string($_POST['nume']) ca sa-mi adauge backslash-ul. insa in baza de date nu se adauga backslash ci se scrie exact ce am scris in folmular
apoi am incercat sa introduc si mysql_real_escape_string si imi in baza de date nu mai scirie nimic e nula si la fel si in pagina imi afiseaza "inregistrare .....pentru nume: aici trebuia sa apara \" cu backslash pt ca am introdus mysql_real_escape_string, dar nu apare
si apoi afiseaza eroarea asta in pagina

Cod: Selectaţi tot

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\inreg.php on line 57

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\wamp\www\inreg.php on line 57
din ce cauza nu functoneaza mysql_real-escape_string? de ce imi pune automat \ daca eu nu am folosit mysql_real_escape_string ?
si inca o intrebare: daca vreau sa copiez pe un cd o baza de date mysql cu tot toate tabelele din ea pentru a o muta la alt server pe un alt pc este corect sa copiez folderu data din mysql si apoi sa-l folosesc la alt pc? adica vreau sa spun nu depinde de restul serverului folderu data?e independent?

MarPlo Mesaje:4343
Functia mysql-real-escape-string() se foloseste dupa crearea conexiunii la baza de date, iar acel backslash care apare, probabil e adaugat fiindca e activat get_magic_quotes_gpc() in php.ini .
Gasesti aici un tutorial despre Adaugarea datelor in tabele MySQL.

Daca vrei sa transferi o baza de date pe alt server, faci Export la ea, din PhpMyAdmin, apoi, pe celalalt server folosesti Import.