Avatar billede whyme Nybegynder
15. juli 2005 - 12:12 Der er 21 kommentarer og
4 løsninger

Sikker submit af oplysninger i en formular eks sql injections

Hejsa eksperter,

Er der nogen som har en god måde at få sikkerheden lidt op i normalt PHP kode, ved at gøre så man ikke kan lave SQL injections eller hvad det hedder, altså kunne skrive SQL commands i en formular, for at hacke en hjemmeside.

Det vil også være smart at til den funktion, hvis man samtidig kunne tjekke for HTML, hvis man vil (det er "lovligt" nogen steder at bruge HTML).

Er der nogen som kan hjælpe mig med at lave en sådan funktion eller ligger inde med en som kan klare dette?

Jeg har ikke formået at lave en selv, så håber i kan hjælpe.

På forhånd mange tak
Avatar billede locturian Nybegynder
15. juli 2005 - 12:18 #1
Måden du sikre dig for at undgå SQL injections, er ved at erstatte (replace) alle ' tegn i en streng, med dobbelt ' (Altså '').

Normalt ville man lave en injection der "stopper" en sql kommando, og indsætter sin egen sql - Men det undgår man altså ved, at erstatte ' tegnet...
Avatar billede ksoren Nybegynder
15. juli 2005 - 12:27 #2
Der ligger vist et par artikler om dette emne.

At erstatte ' med '' kan være en direkte farlig operation sammen med php og magic quotes
Avatar billede whyme Nybegynder
15. juli 2005 - 12:29 #3
Men hvis jeg nu har en hel side som er kodet osv. vil det være lidt vildt at skulle igang med at lave et eller andet hver eneste sted.

Jeg tænkte på om man ikke kan lave en function til dette, og så køre de strenge igennem den function?

Er det den eneste måde at fjerne folk fra at bruge injections? altså med ' = '' ?

Hvis man nu har ' tegn i selv ens streng, og ikke har interesse i at få '' tegn hver sted der er ' tegn, hvordan løses det så?
Avatar billede busschou Praktikant
15. juli 2005 - 12:40 #4
Du erstatter ikke ' med " , du erstatter ' med to ' , altså '' , hvorved ' bliver escapet og opfattes som ' :o)
Hvis du kan følge det

Men det er ikke nødvendigvis nok til at sikre sig!
Sql injections er et kæmpe emne og afhænger også meget af hvilken database der benyttes
Avatar billede myplacedk Nybegynder
15. juli 2005 - 13:06 #5
Den *eneste* gode måde at undgå SQL injections (og mange andre problemer) er følgende:
Når strengen indsættes i en SQL-query, behandles de farlige tegn som de skal. Med PHP og MySQL kan du fx. bruge addslashes().

> Det vil også være smart at til den funktion, hvis man samtidig kunne tjekke for HTML, hvis man vil
Lad mig gætte:
En bruger kan indtaste en stump tekst, som skal vises på en HTML-side. Teksten indtastes som almindelig tekst, ikke HTML, RTF eller noget som helst, kun tekst.
Der er også kun *en* måde at gøre det på: Konvertere teksten til HTML-format. Fx. sådan her:
$html = nl2br(htmlspecialchars($plaintext));
Så er der kun whitespace at bekymre sig om, dvs. fx. flere mellemrum i træk. Oftest kan det problem bare ignoreres, ellers kan man oftest bare sætte det i et pre-tag.
Avatar billede busschou Praktikant
15. juli 2005 - 13:06 #6
hmm kan ikke lige finde det, fandt ellers en artikkel på nettet for lang tid siden
Men google boomer jo med artikler på det område

Jeg er ikke mysql/php ekspert
Men hvis du nu for eksempel har en GET metode som skal hente et tal
Så vil du ikke forvente ' i din sql fordi der ikke skal ' omkring tal
Så hvis du har noget ala
---
www.dinside.dk/test.php?id=4
$id = $_GET['id'];
$sql = "Delete * From tabel Where id = $id";
---
Den går godt
Men hvad med denne her
---
www.dinside.dk/test.php?id=0;Drop database;
---
Så bliver din sql til
$sql = "Delete * From tabel Where id = 0; Drop database";
Som sagt er jeg ikke 100 inde i mysql og hvilke operatorer den benytter til at eksekvere en kommando med, men jeg tror eksemplet taler for hvor jeg vil hen :o)
Avatar billede busschou Praktikant
15. juli 2005 - 13:09 #7
og hvis som myplacedk siger at addslashes() tager højde for det, så klarer den nok også det :o)
Avatar billede myplacedk Nybegynder
15. juli 2005 - 13:45 #8
Hvis man forventer et tal, så er den bedste løsning (også af mange andre grunde) at sikre sig, at det er et tal. Den simple løsning:
$id = (int)$_GET['id'];
Så er $id 100% sikkert et tal.
Og det er altså ikke først når det indsættes i noget SQL, det er så snart data hentes, og dermed inden det bliver brugt til noget som helst. Du kan validere om det overhovedet er et tal først, men det er det.

Eks:

$age = @$_GET['age'];
if ($age != 0 && is_empty($age)) {
  $error = "Alder ikke udfyldt";
  $age = null;
} elseif (!is_numeric($_GET['age']) {
  $error ="Alder skal være et tal";
  $age = null;
} else {
  $age = (int)$age; // Nu er $age med sikkerhed et tal
  if ($age < 0) {
    $error = "Alder skal være mindst nul";
    $age = null;
  } else if ($age > 150) {
    $error = "Yeah right...";
    $age = null;
  }
}

Nu er $age enten en gyldig alder, eller null. Nice and safe. Du skal dog nok sikre dig at null bliver til NULL i SQL'en, og ikke fx. en tom streng.
Avatar billede ksoren Nybegynder
15. juli 2005 - 14:43 #9
Hvis man altid vil sikre sine strenge, uanset php.ini, bør man kontrollere med get_magic_quotes_gpc() om input allerede har været igennem addslashes()


Mht ' => '' og magic quotes

Hvis jeg submitter: hello'world
Afleverer php: hello\'world
Bliver til: hello\''world

Så vil mysql(?) se 'world' som en kommando. Dvs vores script har den modsatte virkning
Avatar billede myplacedk Nybegynder
15. juli 2005 - 15:52 #10
magic_quotes skal altid være slået fra. Punktum. Den ide er en af de værste PHP-folkene nogensinde er kommet med.
Kan man ikke slå det fra, må man omgå det ved fx. at modificere $_GET mv. tilbage til det rigtige, inden data bliver behandlet.

> Hvis jeg submitter: hello'world
> Afleverer php: hello\'world

Det er en fejl i PHP's opsætning, magic_quotes er slået til. Kan du ikke slå det fra, må du reverse effekten med stripslashes.

> Bliver til: hello\''world
Det håber jeg da ikke, så vidt jeg husker skal MySQL konfigureres specielt til det, for at forstå ''-syntaxen, hvor man samtidig ikke længere kan bruge \'-syntaxen. Så vidt jeg husker.

Hvis nogen ikke bare tænker "OK" til det, vil jeg anbefale at læse denne artikel:
http://myplace.dk/articles/stripslashes/
Avatar billede ksoren Nybegynder
15. juli 2005 - 16:06 #11
> Bliver til: hello\''world

Det var til første indlæg. Bruger man den løsning, og magic quotes er on, så åbner det op for sql injection. Dvs det har den modsatte effekt. \' bliver til en apostrof. Den sidste ' afslutter strengen, derfor injection.

magic quotes har reddet MANGE fra at få deres hjemmeside hacket. Så lidt positiv effekt har den haft :)
Avatar billede busschou Praktikant
15. juli 2005 - 16:12 #12
holdninger holdninger...tsk tsk
Gælder det ikke bare om at sikre sin kode bedst muligt, uanset noget slået fra eller til?
Jeg er sikker på at intet bliver tilføjet php ved tilfælde så mon ikke der er tilfælde hvor alt kommer til sin ret :o)
Avatar billede myplacedk Nybegynder
15. juli 2005 - 16:55 #13
> magic quotes har reddet MANGE fra at få deres hjemmeside hacket. Så lidt positiv effekt har den haft :)
Det har forhindret mange, mange flere at lære om SQL-injections. Det bliver jo håndteret automatisk- tror de.
Pointen med funktionen er, at det kører automatisk. Men det gør det ikke. Det er sikkert som en stor fed hængelås, hvor alle kunder har ens nøgler = falsk sikkerhed.

> holdninger holdninger...tsk tsk
Ja, men ikke "bare holdninger". De deles med folkene bag PHP, og mange* sikkerhedseksperter.

> Gælder det ikke bare om at sikre sin kode bedst muligt, uanset noget slået fra eller til?
Jo. Men med magic_quotes slåes til bliver det sværere.

> Jeg er sikker på at intet bliver tilføjet php ved tilfælde så mon ikke der er tilfælde hvor alt kommer til sin ret :o)
Er du også sikker på, at der ikke bliver taget forkerte beslutninger?

Anden sætning i første afsnit på "http://dk2.php.net/magic_quotes": "It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed."

magic_quotes er default slået fra i PHP, af sikkerhedsmæssige årsager. De er nemlig blevet klogere, siden det var default slået til (af sikkerhedsmæssige årsager).

*) Nok de fleste af dem, som har undersøgt sagen.
Avatar billede busschou Praktikant
15. juli 2005 - 17:00 #14
Nej jeg er nu også sikker på at der bliver truffet forkerte beslutninger som der så rettes op på, sådan er det med alt
Og du siger jo selv der er rettet op på det
Eller det vil sige, du lyder som om du "ved alt og er super ekspert"
Så hvad er problemet
Det er jo som du selv siger default slået fra? fordi de er blevet klogere?
Eller nåååh nej
Det er jo ikke fjernet helt
Så ergo mener du enten de ikke er helt kloge nok eller også har de stadig en god grund til at man selv stadig kan slå det til?
Men det er du nok klog nok til at svare på ? ;o)
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:11 #15
> Og du siger jo selv der er rettet op på det
Ja, så vidt muligt.

> Eller det vil sige, du lyder som om du "ved alt og er super ekspert"
Emnet er ret simpelt (for nørder), så det er ikke så svært at blive "super ekspert".

> Så hvad er problemet
At nogle stadig bruger magic_quotes.

> Det er jo som du selv siger default slået fra? fordi de er blevet klogere?
Nemlig.

> Eller nåååh nej
Jo, det er slået fra, fordi de er blevet klogere. Det siger de selv.

> Det er jo ikke fjernet helt
> Så ergo mener du enten de ikke er helt kloge nok eller også har de stadig en god grund til at man selv stadig kan slå det til?
Om det er en god ide kan diskuteres, men funktionen er der endnu pga. "public demand".

> Men det er du nok klog nok til at svare på ? ;o)
Yep. ;-)
Avatar billede busschou Praktikant
15. juli 2005 - 17:18 #16
Du modsiger jo dig selv :o)
Det er som default slået fra fordi de er blevet klogere
Men siden det ikke er fjernet helt så har de jo nok en god grund til man kan slå det til selv hvis man har behov for det
Ellers havde de vel fjernet det helt
Avatar billede busschou Praktikant
15. juli 2005 - 17:19 #17
Men anyways, det var ikke for at komme ud i en lang debat om det!
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:20 #18
"public demand". Nogle bliver sure, hvis de ikke kan bruge magic_quotes. "OK" sagde de så. "Slå det til, hvis i virkelig vil, det er jeres problem". Problemet er al den gamle kode, som ikke virker uden magic_quotes. Årsagen er altså historisk, ikke fordi det er en god funktion.
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:22 #19
Hvor modsiger jeg mig selv?

> Men anyways, det var ikke for at komme ud i en lang debat om det!
Jeg skrev artiklen netop for at undgå debatter som denne her. Jeg skal vist gøre det tydeligere, at magiq_quotes er slem og skal slås fra, og bemærke at PHP-holdet er enig.
Avatar billede busschou Praktikant
15. juli 2005 - 17:26 #20
Nej du skulle såmen bare komme med en forklaring på hvorfor funktionen stadig kan slås til
Du lyder som om du ved alt og kender php holdet personligt
Du nærmest sviner funktionen til
Du roser folkene bag ved fordi de er kloge nok til at slå den fra som default
Fordi du mener de er kloge og gør det rigtige
Men du mener alligevel ikke de har gjort det rigtige fordi du helst så funktionen helt væk
Ergo modsagde du dig selv :o)
Og alt der skulle til var en fornuftig forklaring på hvorfor funktionen så stadig findes frem for alt det andet snik snakkeri
Og den kom du så med
og så er den jo ikke længere ...vel ? :o)
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:41 #21
> Nej du skulle såmen bare komme med en forklaring på hvorfor funktionen stadig kan slås til
OK

> Du lyder som om du ved alt og kender php holdet personligt
Jeg ved nok sådan ca. alt om dette emne, som sagt er det ret simpelt. Og så læste jeg deres annoncering om emnet, da de ændrede defaulten.

> Du nærmest sviner funktionen til
Øh, ja. Det er svært at gøre det tydeligt nok, at den giver *dårligere* sikkerhed.

> Du roser folkene bag ved fordi de er kloge nok til at slå den fra som default
> Fordi du mener de er kloge og gør det rigtige
> Men du mener alligevel ikke de har gjort det rigtige fordi du helst så funktionen helt væk
> Ergo modsagde du dig selv :o)
For det første: Det er ikke en modsigelse. Bare fordi det var rigtigt at slå det fra som default, gør ikke alt andet de gør rigtigt.
For det andet: Jeg har ikke sagt at det er forkert, at de ikke har fjernet funktionen. Jeg har blot sagt, at det kan diskuteres. Ja, personligt så jeg den helst forsvinde, men jeg kan godt se argumenterne for at beholde den. Om den skal væk, kan diskuteres.
Avatar billede sukos Juniormester
15. juli 2005 - 21:22 #22
whyme,
"Men hvis jeg nu har en hel side som er kodet osv. vil det være lidt vildt at skulle igang med at lave et eller andet hver eneste sted.

Jeg tænkte på om man ikke kan lave en function til dette, og så køre de strenge igennem den function?"


well, har du først noget kode, så bliver du jo nødt til at ændre!
Men kik på: http://www.eksperten.dk/artikler/190
Avatar billede whyme Nybegynder
07. august 2005 - 00:04 #23
Mange tak, kom med nogen svar :)
Avatar billede myplacedk Nybegynder
07. august 2005 - 08:02 #24
ok
Avatar billede busschou Praktikant
07. august 2005 - 08:52 #25
ved ikke om jeg er med i de svar, kan jeg ikke helt huske ;o)
Men her er et :o)
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