mysql php sql injection?

Tags:    php sql

Hej
Sidder og er ved at udvikle nogle formulare til webside, der lader dig vælge forskellige variable i dropdown menuer, som så refere til tabelnavne i en database. Hvor selve operatoren også kan vælges f.eks < eller > alle variabler er fra en html formular. Men den er piv åben for sql injection en sådan query i php, uden nogen form for beskyttelse.

Hvad er best practise på sådan et område, når man ikke kan escape alle variablerne grundet de er tabelnavne og operatore osv?

Kan det laves sikkert i php/mysql til at undgå sql injections? Uden at skulle hardcore hver enkel mulig query?

Fold kodeboks ind/udPHP kode 




3 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
jeg vil anbefale dig at bruge Prepare Statement

mysqli en quick guide til http://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf

PDO er det kraftigt forbedret, men bygger på de sammen principper




Du tænker at 'table' i dit eksempel kunne være et brugervalgt?

Jeg tror det er vigtigt et skelne mellem validering og escaping. Escaping er at du vil indsætte data som er iorden, men vil undgå at det bliver misforstået af databasen pga. symboler. Validering er at det data som du har fået er korrekt struktureret.

Så hvis jeg skriver i 'Om mig' feltet på din hjemmeside følgende: ; DROP DATABASE accounting

Så kan det f.eks. godt blive valideret, det er en gyldig tekststreng under en max længde. Dermed er det ikke en 'forbudt' streng, men for at indsætte den i databasen skal den escapes. Samme streng er derimod forbudt som et tabelnavn og kan i denne situation ikke valideres.

For selve escaping kan du bruge: http://php.net/manual/en/function.mysql-real-escape-string.php hvis det er rent mysql.

Det lyder som om at det 'blot' er valideringen du mangler før du overvejer at indsætte det i databasen. Lad os sige at i din form kan man vælge enten Fakturaer med value table_faktura eller Personer med value table_person. Så når du får POST data fra formen er den enten $_POST['table'] = 'table_faktura' eller $POST['table'] = 'table_person'. Hvis nogen prøver at omgå vil den f.eks. være

$_POST['table'] = '; DELETE * FROM table_person'

Hvilket ikke er en gyldig table værdi. Så løsningen på det problem kunne være at have en whitelist over gyldige tabeller:

in_array($_POST['table'], array('table_faktura', 'table_person'), true)

Og hvis dette udtryk er sandt, er den sikker at bruge i din SQL streng som tabelnavn.

Men som Ronny siger så er PDO en nemmere måde end manuelt at kalde real_escape_string.



Indlæg senest redigeret d. 18.02.2017 09:56 af Bruger #14645
Hej

Tak for jeres svar, er gået i krig med at genopfrisk min PDO.

Men som jeg ser det kan PDO kun bruges til paramtre som i WHERE id = ?

Som jeg kan læse ud fra jeres svar, ville i bruge nogle whitelists da jeg gerne vil lave nogle queries som WHERE $columnname $operator $value
Hvor alle 3 der kommer fra input i en form, så $columname og $operator, smider jeg i en form for whitelist?



t