Avatar billede k_jr Nybegynder
16. februar 2009 - 10:31 Der er 10 kommentarer og
1 løsning

Hvordan undgår man sql injections?

Hej eksperter

Som en naturlig del af en webapp jeg bikser med privat, vil jeg gerne højne sikkerheden.

Sql injections virker som en rimelig seriøs ting, man bør undgå, men hvordan?


Jeg stødte på denne kode på php.net:

function encodeText($_str) {
  $_str = strip_tags($_str);
  $_str = trim($_str);
  $_str = htmlentities($_str);
  $_str = str_replace("\r\n", "#BR#", $_str);
  return($_str);
}


function decodeText($_str, $_form) {
  $trans_tbl = get_html_translation_table (HTML_ENTITIES);
  $trans_tbl = array_flip ($trans_tbl);
  $_str      = strtr($_str, $trans_tbl);
  if ($_form) {
    $_nl = "\r\n";
  } else {
    $_nl = "<br>";
  }
  $_str      = str_replace("#BR#", "$_nl", $_str);
  return($_str);
}


Vil det være nok for mig, at:

1. køre encodeText() på hele _POST, _GET og _REQUEST arraysne i en init rutine (før nogle vars bliver benyttet)
2. Gemme outputtet direkte i databasen (vha PEAR::MDB2 + dens quoting)
3. Vise indhold fra databasen (alm selects) kun påført decodeText()


Nogen input?

mvh
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 10:35 #1
Du skal intet gøre ved din tekst, altså encodeText - det er teknik fra sidste årtusing. SQL-injection skal ikke løses ved at lave tekst om, men ved at bruge SQL-maskinens egne funktioner til at sikre input, dvs: http://php.net/mysqli med parameters (altså SQL-strenge med "?"-ere hvor værdierne skal stå).

Eller http://php.net/PDO

Dermed er muligheden for SQL-injections pist væk, og du kan koncentrere dig om alt det andet.
Avatar billede k_jr Nybegynder
16. februar 2009 - 10:40 #2
Vil det sige, at jeg egentlig kan nøjes med at bruge quote() fra PEAR::MDB2 ??
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 10:41 #3
Øh, hvilket databasesystem anvender du?
Avatar billede k_jr Nybegynder
16. februar 2009 - 10:42 #4
MySQL 5...
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 10:49 #5
Ok. Men så er der ingen grund til at bruge quote() fra PEAR::MDB2.

Kig på eksemplerne med mysqli, og gæld dig over at du ikke længere skal klistre sql-strenge sammen, og bekymre dig om hvad de indeholder.
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 11:01 #6
Men du kan bruge prepared statements i mdb2, fx:

$statement = $mdb2->prepare('INSERT INTO people VALUES (?, ?)');
$data = array(7, 'Dave');
$statement->execute($data);
$statement->free();

Blot aldrig, aldrig, aldrig begynde at klistre værdier in i SQL-strengen på denne måde:

        'SELECT name FROM people WHERE id = '. $db->quote(1, 'integer')
Avatar billede k_jr Nybegynder
16. februar 2009 - 11:09 #7
Men... hvorfor ikke som i sidste eksempel? Er det ikke udbredt praksis?

Tænker at prepared statements er super gode, hvis man vil bevare noget frihed til at vælge database... men kani kke komme i tanke om mange flere fordele..

Skær det gerne ud i pap :-)
(kommer på igen efter kl 17)
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 11:14 #8
Prepared statements sikrer dig mod sql-injections, uden at du skal tænke og huske osv. Det er din og din kundes garanti.

"udbredt praksis" med at klistre sql-sætninging sammen?? Kun hvis du læser oldgamle tekster (sidste årtusinde). Men dem er der selvfølgelig også mange af.
Avatar billede k_jr Nybegynder
16. februar 2009 - 16:32 #9
Tak for uddybning.
Det har jeg skrevet mig bag øret.

Smid svar. :-)
Avatar billede erikjacobsen Ekspert
16. februar 2009 - 17:07 #10
Jeg samler slet ikke på point, tak.
Avatar billede k_jr Nybegynder
16. februar 2009 - 20:51 #11
Tak for hjælp da. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester