pSQL - Prevent SQL Injection

Tags:    php

Hej Udviklere!
Jeg har idag kedet mig lidt i nogle timer og har derfor lavet et script jeg vil dele med jer' som skulle sikre mod mysql injection.

Fold kodeboks ind/udKode 


- Bedøm gerne :)



Den bedste løsning er i stedet at sørge for at dine inputs er beskyttede korrekt vha. f.eks. mysql_real_escape_string, eller efter min mening bedre, prepared statements.

Dit script tjekker udelukkende efter et den gode gamle n=n, efterfulgt af en udkommentering. Alt efter hvor crackeren får adgang, kan vedkommende også vælge at bruge f.eks. "1=1)--" eller "');<ond kommando her>;--". Bemærk at den sidste slet ikke indeholder en n=n.

Konklusionen må være at det at forsøge at beskytte sig med specifikke inputs ikke redder dig, det gør kun inputvalidering.



Den bedste løsning er i stedet at sørge for at dine inputs er beskyttede korrekt vha. f.eks. mysql_real_escape_string, eller efter min mening bedre, prepared statements.

Dit script tjekker udelukkende efter et den gode gamle n=n, efterfulgt af en udkommentering. Alt efter hvor crackeren får adgang, kan vedkommende også vælge at bruge f.eks. "1=1)--" eller "');<ond kommando her>;--". Bemærk at den sidste slet ikke indeholder en n=n.

Konklusionen må være at det at forsøge at beskytte sig med specifikke inputs ikke redder dig, det gør kun inputvalidering.

Hvor beskytter han imod specifikke inputs? Det eneste han reelt gør er jo lige netop som du siger at køre dem igennem mysql_real_escape_string



Hele v2 funktionen har til formål at tjekke efter specifikke inputs, matchende ud fra en regular expression:
Fold kodeboks ind/udKode 

Jeg er ikke alt for stærk i regexps, men det ligner for mig et tjek efter en klassisk "' OR n=n--"-injection.

Jeg er dog klar over at han escaper alt input, men så er vi tilbage ved Magic Quotes. Hvorfor escape alt input, og kører en regular expression på hver inputvariabel, hvis man f.eks. ikke bruger alle inputs i en database, eller vælger at bruge prepared statements eller lignende.

En helt anden ting er, hvad så hvis man bruger cookie variabler? De er ikke beskyttet her jo. Så risikere man bare at man får alle ens post- og get-variabler escaped, men så glemmer man lige at få dem fra cookies escaped også.

Jeg holder derfor stadig på at det er bedst at escape sine inputs der hvor det er nødvendigt, og være klar over at man gør det, frem for at escape alle inputs, og så tage det for givet at de er escaped. Såvidt jeg ved var dette også en af grundene til at magic quotes blev fjernet fra PHP.



t