PHP forms og sikkerhet

En tråd i 'PHP, SQL og databaser' startet av Zolic, 20 Aug 2009.

  1. Zolic Medlem

    Innlegg:
    52
    Mr Vest og olafmoriarty liker dette.
  2. Tonny Kluften

    Tonny Kluften Administrator

    Innlegg:
    15.966
    Så å sette inn dette er egentlig nok ang. sikkerhet?

    Kode:
    <?php
    $Action = preg_replace ('/[^a-z0-9]/', '', strtolower ($_GET['action']));
    ?> 
    
     
  3. Zolic Medlem

    Innlegg:
    52
    I hovedsak bruker en htmlspecialchars() om det er skrevet i PHP.
    Men jeg postet heller link (Nettsikkerhet.no ++ Innføring i inn og utdata) da det lett kan gjøres feil om en ikke har full forståelse for problemet, som igjen bare gjør mer farlig...

    s
     
    Sist redigert av en moderator: 20 Aug 2009
  4. Zolic Medlem

    Innlegg:
    52
    Om du kun ønsker å vaske inndata, så ja.

    I løsninger som henter data ifra databaser og lignende, vil jeg ikke anbefale det. Der vile jeg nok heller ha validert inputen, før det sendes request til databasen...

    Men si det er et søk, da kan du ikke vaske inndataen, da må alt med -> Validering. Så ønsker du å vise hva brukeren har søkt på også.

    Men om brukeren skrev
    Kode:
    <script>alert('XSS');</script>
    så ønsker du jo ikke at den skal fungere så da må output escaping inn i bilde også...

    slik dette forumet gjør, så du får
    Kode:
    &lt;script&gt;alert(&quote;XSS&quote;);&lt;/script&gt;
    Ikke quote meg direkte på resultatet output escaping gir... da jeg ikke husker aller htmlentitis i hode... men det gir et inntrykk av hva som skjer :)
     
  5. Tonny Kluften

    Tonny Kluften Administrator

    Innlegg:
    15.966
    Jeg har ikke full forståelse for problemet. Hvis koden under kan brukes som case (og du gidder). Hva vill du gjort for å sikre det?

     
  6. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg har ikke sett på linken du kommer med, men det ser jo ut til at du fortjente det ryktepoenget jeg nettopp gav deg. Skal se på linken i kveld. :)
     
  7. skogtrollet

    skogtrollet Medlem

    Innlegg:
    208
    Hvorfor trenger man egentlig å vaske inndata som settes inn i en database? Kan man ikke bare gjøre det på utdata? Da tenker jeg på html koder.

    Tegn som kan manipulere en sql query må selvfølgelig vaskes før den brukes i en query.
     
  8. Zolic Medlem

    Innlegg:
    52
    @Tonny sin case

    Etter en litt hurtig gjennomgang har jeg kommet frem til
    Med en utestet rettelse, men den tar for seg de problemene jeg så i farten.

    Poenget er at sikkerhet er en prosess som må tas med når applikasjonene skrives, da slipper en mange "fikser" i etterkant, som kanskje åpner for nye hull... Ja utviklingstiden blir lengre, men for all del det er verdt det!

    Prøvd å putte tegn og bokstaver i en rad som skal ha int(heltall)?
    Og det er da ingen som har navn med for eksempel <> i seg, derfor er det heller ingen vits i å tillate dette:)
     
    Sist redigert av en moderator: 20 Aug 2009
    Tonny Kluften liker dette.
  9. hansvh

    hansvh Medlem

    Innlegg:
    165
    Man kan, men det er jo ikke noe lettere. Koden blir lik.

    Fordelen ved å vaske ved input er at dette gjøres en gang. Vask ved output må eksekveres hver gang dataene skal vises og dette fører til tregere lasting av siden.
     
  10. skogtrollet

    skogtrollet Medlem

    Innlegg:
    208
    Ah den ser jeg. En ulempe med å vaske innput blir da at informasjonen i databasen blir større og tar mer plass. Og det kan skape problemer hvis et felt har maks grense på f.eks 10 bokstaver, og vaksingen fører til at strengen blir lengre enn 10 tegn.
     
  11. Tonny Kluften

    Tonny Kluften Administrator

    Innlegg:
    15.966
    Det virker det bortsett fra at når et påkrevet felt ikke blir fyllt å så kommer beskjeden på neste side:

    Fatal error: Call to undefined function genval() in /home/ladfgo/public_html/sdfgia.no/nettbutikk/process.php on line 50
     
    Sist redigert: 20 Aug 2009
  12. Zolic Medlem

    Innlegg:
    52
    putt
    Kode:
    function genVal($str=NULL)
    {
    //forenklet validerings funksjon
    if(empty($str))
    {
    return false;
    }
    // vanlig quote er ikke med her
    $TryggeChars = addslashes('.!?.\'*|$[]<>%#^/:;').'\\w\\pL \\(\\)\\&-';
    if(preg_match('^['.$TryggeChars.']\\z/um', $str)) // /u = UTF-8 encodedcheck - krever at dokumentet er UTF-8 /m er multiline, så den ikke stopepr på linjeskift(\n)
    {
    // om ikke noe matcher noe annet enn hva som er lov
    return $str;
    }
    i en egen fil, så kjører du require_once('denfila.php'); på alle side hvor det blir benyttet :) husk at det er case-sensitivt hva funksjonsnavnet heter!


    @skogtrollet og hansvh: det er viktig å skille imellom input-vasking, input-validering og output-escaping. Input-vasking gjør ikke data større, da den fjerner det som ikke hører til.
    Input-validering vil heller ikke gjøre det noe større, da den vil gi en feilmelding om det ikke blir godtatt.
    Output-escaping, kan gjøre data noe lengre ja... dette må tas med i bereiningen når database strukturen lages(men nå er det bare meta-tegn til database som skal escapes før det sendes dit, så er ofte minimal øknik i lengde)...

    Og utdata til browser skal i utganspunktet ikke vaskes, men escapes;)
     
    Sist redigert: 20 Aug 2009
  13. Tonny Kluften

    Tonny Kluften Administrator

    Innlegg:
    15.966
    Takk igjen Zolic. Den er god.

    Da henter jeg inn dette.

    (Skal vel ha med
    PHP:
    return false;
    }
    på slutten selv om du ikke hadde tatt med den i koden over?)

    Så får jeg en ny feilmelding:

    Warning: preg_match() [function.preg-match]: Unknown modifier '/' in ... /incbutikk.php on line 11 on line 11
     
    Sist redigert: 20 Aug 2009
  14. Zolic Medlem

    Innlegg:
    52
    Yes, den skal med, den gikk bare glipp av merkingen ;)
    Jeg var litt rask i svingen tydeligvis, det skal være(endre hele linja:

    $TryggeChars = addcslashes('.!?.\'*|$[]%#^/:;', '.!?.\'*|$[]<>%#^/:;').'\\w\\pL \\(\\)\\&-';


    notat: $tryggechars, det som står inne addcslashes('dette er lovlige tegn', 'dette er tegn som må escapes for preg motoren').
     
    Tonny Kluften liker dette.
  15. erlinglothe New Member

    Innlegg:
    4
    Er vel fortsatt bom?

    Denne er vel bedre

    $TryggeChars = addcslashes(".!?.\'*|$[]%#^/:;", ".!?.\'*|$[]<>%#^/:;').'\\w\\pL \\(\\)\\&-");
     

Del denne siden