Robert1995 Posted June 3, 2011 Report Posted June 3, 2011 SQL injection se face direct din URL si $_POST la search de exemplu , dar o sa vorbesc mai mult doar despre url , de exemplu sa zicem ca am o tabela "Page" cu "rows" : id ( primary key ) , title , body , etc.I.Sa zicem ca lucrez doar cu iduri , cam urat , dar could do the trick .Cand arat pagina iau din url parametri cu $_GET,$this->_getAllParams .$target = $_GET['id'] ; //idul pagini care vreau sa o vadif(!is_numeric($target)){ // arata o eroare}else{ // arata pagina .}In CodeIgniter , este Routing care este foarte flexibil si folositor , pentru ca verifica daca $target e numeric la route , daca nu e numeric da error ca pagina nu exista ( $route['product/:num'] = "catalog/product_lookup"; , da e exemplul din user guide)Daca nu este numar ( da stiu ca e -1 , dar nu cred ca un om normal ar face un id negativ , nici nu stiu daca e posibil )ImageShackDaca este numarImageShackAr mai fi ...$target = $_GET['id'];$target_bucati = explode( " " , $target );$target = implode( "" , $target_bucati);Exemplu $target = "I will try to test this thing";$target_bucati = explode(" " , $target);$target = implode("" , $target_bucati);var_dump($target);Test PHP onlineDe ce sa fac asta ? Simplu prin acest simplu trick stupid din SELECT `booktitle` FROM `booklist` WHERE `bookId` = 'OOk14cd' AND '1'='1'; Se face SELECT`booktitle`FROM`booklist`WHERE`bookId`='OOk14cd'AND'1'='1';Da e exemplul de blind SQL de pe wikipedia .Hope this helped,astept comentarii,vreau sa intelegeti nu sunt hacker,si nu prea am experianta in acest `domeniu`,dar o sa incerc sa invat .Daca sunt modalitati sa treceti de aceste `trickuri` habar nu am cum sa le zic , va rog comentati.Da si daca am greseli de scriere puteti comenta , am verificat o data repede inainte sa dau submit . Quote
Andrei Posted June 3, 2011 Report Posted June 3, 2011 E bine ca te-ai gandit la aceste metode. Din pacate, ultimul exemplu oferit de tine nu e chiar asa rezistent pentru ca o sintaxa corecta MySQL (in cazul de fata) poate include comentarii in loc de spatii. Asta inseamna ca AND/**/1=1 se va executa. Mai sunt cateva variante in acest sens LE : Ai putea folosi str_replace pentru a elimina caracterele nedorite. Pe langa spatii, alege si + /* */. Anyway, cred ca e mai bine sa validezi in alte moduri query-ul. Multa bafta! 1 Quote
Robert1995 Posted June 3, 2011 Author Report Posted June 3, 2011 (edited) Imi pare bine ca in sfarsit a raspuns cineva , am imaginatie poftim , problem solved easy way$target = "I will try to test this/**/thing";$to_explode = array(" " , "/**/" , ",");// fac edit pe masura ce aflu virgula am pus-o sa "previn" group concatforeach($to_explode as $exp){ $target_bucati = explode($exp , $target); $target = implode("" , $target_bucati);}var_dump($target); Edit : Nu presupun ca este o solutie buna sau decenta , este doar o solutie simpla care mi-a venit in cap acum cand ma uitam la Dar good point cu str_replace am si uitat de el , thanks a lot Edited June 3, 2011 by Robert1995 Quote
Andrei Posted June 3, 2011 Report Posted June 3, 2011 Defapt solutia cea mai simpla este sa nu permiti crearea unui query valid.Daca vei crea interogarile folosind ghilimelele + mysql_real_escape_string va rezolva majoritatea (daca nu cam toate) problemele ce pot aparea.Asta inseamna ca e indicat sa folosesti : $q = "SELECT * FROM x WHERE bla = '".mysql_real_escape_string($_GET['id'])."'"; Legat de codul tau, mai simplu : $target = "I will try to test this/**/thing";$target = str_replace(array(" " , "/**/" , ","),'',$target); var_dump($target); Bafta. Quote
Nytro Posted June 3, 2011 Report Posted June 3, 2011 Cel mai simplu, pentru toate tipurile de filtrari, atat XSS cat si SQL Injection sau mai stiu eu ce, transformi caracterele speciale, cat mai multe, in entitati HTML. http://www.exploit-db.com/download_pdf/12904 Quote
denjacker Posted June 3, 2011 Report Posted June 3, 2011 (edited) Daca esti foarte paranoic....$whitespace = array (' ', '+', '/**/', '/*!*/', '/*', '--', '%23', '%20', '%09', '%0a', '%0b', '%0c', '%0d', '%a0', 'union', 'select', '.', '=', '<', '>', '^', '!=', '%', '/', '*', '&', '&&', '|', '||', '>>', '<<', '>=', '<=', '<>', '<=>', 'XOR', 'DIV', 'SOUNDS LIKE', 'RLIKE', 'REGEXP', 'IS', 'NOT', 'BETWEEN', 'concat', 'group', 'ws', '_', '@@', '(', ')', 'and', 'false', 'substring', 'benchmark', ',', 'information', 'schema', 'from', 'where', 'order', 'group', 'limit', 'find_in_set', 'or', 'having', 'extractvalue', 'xmlupdate', 'procedure', 'if', '%00' );Am adaugat cam ce mi-a venit acum in minte.foreach ($whitespace as $key => $aham { ...do some stuff...}Ce primesti din $_POST , $_GET treci prin strtolower() si dai replace la ce ai in array...Sau daca nu vrei cu array si black-listfunction inputFilter(){foreach($_POST as $key => $p) { $_POST[$key] = htmlentities($p); $_POST[$key] = mysql_real_escape_string($p); $_POST[$key] = html_entity_decode($p); } foreach($_GET as $key => $g) { $_GET[$key] = htmlentities($g); $_GET[$key] = mysql_real_escape_string($g); $_GET[$key] = html_entity_decode($g); } foreach($_REQUEST as $key => $r) { $_REQUEST[$key] = mysql_real_escape_string($r); } } Sau poti sa le combini..Teoretic, ar trebuii sa fie de ajuns. (teoretic ! ) Edited June 3, 2011 by denjacker Quote
Nytro Posted June 3, 2011 Report Posted June 3, 2011 denjacker: Nu e bine nici asa, pot sa apara probleme daca filtrezi cuvinte. De exemplu, ce se intampla cu Western Union? Nu trebuie sa fi chiar atat de paranoic, sunt cateva caractere mai importante: , - / \ ' " ( ) . < > : $ = [ ]Bine, sunt destule, dar daca sunt inlocuite cu entitatile HTML, pe langa 4 octeti in plus ocupati in baza de date, nu vor fi probleme. Bine, vor fi! Daca cineva introduce un link si ii transformi "/"-le in entitati va fi urat la afisare, dar totul tine de proiectare. Quote
kNigHt Posted June 4, 2011 Report Posted June 4, 2011 Puteti folosi un Object Relational Mapper (ORM). Cred ca asa nu s-ar mai pune problema SQL injectionului.Doctrine - PHP Object Persistence Libraries and More Quote
UnixDevel Posted June 4, 2011 Report Posted June 4, 2011 poti sa mergi pe u framework ,gen cacke php ,si sa folosesti clase in care sa apelezi funciile sql privat ...sau eu miam facut o clasa inpotriva sqly injection Quote
Robert1995 Posted June 4, 2011 Author Report Posted June 4, 2011 (edited) Imi pare bine ca a venit atata lume sa raspunde la acest thread:) .@n3curatu si eu folosesc Zend ca framework,am Modele pentru fiecare tabela cu fiecare operatie,dar ma gandeam cum sa previn in "php curat" .Putin offtopic : Merita Doctrine 2 impreuna cu Zend ? Edited June 4, 2011 by Robert1995 misstype Quote