15. juli 2005 - 12:12Der 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.
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.
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)
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.
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.
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 :)
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)
> 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).
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)
> 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. ;-)
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
"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.
> 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.
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)
> 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.
ved ikke om jeg er med i de svar, kan jeg ikke helt huske ;o) Men her er et :o)
Synes godt om
Ny brugerNybegynder
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.