Jump to content
Robert1995

Idei de prevenire SQL injection

Recommended Posts

Posted

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 vad

if(!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 )

ImageShack

Daca este numar

ImageShack

Ar 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 online

De 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 .

Posted

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!

  • Upvote 1
Posted (edited)

:) Imi pare bine ca in sfarsit a raspuns cineva , am imaginatie poftim :P, 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 concat
foreach($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 by Robert1995
Posted

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. :-)

Posted (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-list


function 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 by denjacker
Posted

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.

Posted (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 by Robert1995
misstype

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...