[PHP] Ingevoerde velden escapen en controleren.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 10:25
Ik ben nu bezig met het verwerken van ingevulde gegevens van een webformulier.
Graag wil ik mogelijke hacks voorkomen aangezien sommige velden direct een MySQL-query ingaan.

Ik heb de FAQ gelezen en de ' \' '' \\' \\\' " \" "" \\" \\\" ` \` `` \\` \\\` -string succesvol uitgeprobeerd.

Alle waarden die met $_GET, $_POST en $_COOKIE binnenkomen gaan door de zelfde CheckString-functie heen en ziet er bijvoorbeeld zo uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    define("CONVERTERROR","!ERROR!");

    function CheckString($String)
    {
        $NewString = "";
        $Error = 0;
        $Char = 0;
        if ( !get_magic_quotes_gpc() && !get_magic_quotes_runtime() ) 
            $String = addslashes($String);
        
        if ( strlen($String) == 0 )
            $NewString = CONVERTERROR;
        else
        {               
            for ($Teller1 = 0; ( $Teller1 < strlen($String) && $Error == 0 ); $Teller1++)
            {
                $Char = ord ( substr ( $String, $Teller1, 1) );

                if ( $Char == 32 || $Char == 45 || $Char == 46 || $Char == 64 || $Char == 95 || ( $Char >= 48 && $Char <= 57 ) || ( $Char >= 65 && $Char <= 90 ) || ( $Char >= 97 && $Char <= 122 ) )
                {
                    // Dus de karakters ' ', '-', '.', '@', '_' en reeksen 0 t/m 9, A t/m Z en a t/m z zijn toegestaan.
                    $NewString = $NewString.substr ( $String, $Teller1, 1);
                }
                else
                {               
                    $Error = 1; 
                    $NewString = CONVERTERROR;  
                }   
                
            }
        }
        return $NewString;
    }

// Hier is wordt dus de functie aangeroepen:
    $ResultaatWaarde = CONVERTERROR;
    if ( isset($_POST["StringField"]) )
        $ResultaatWaarde = CheckString( $_POST["StringField"] );
    // Als het resultaat CONVERTERROR bevat, zal de gebruiker een foutmelding krijgen.


Ik heb speciaal de functies zoals str_replace niet gebruikt omdat ik later in dit stuk gemakkelijk wijzigingen wil aanbrengen. Ik weet dat het eenvoudiger kan zoals foreach en andere functies, maar daar gaat het nu niet om.

Ben ik met deze functie tegen elk type invoer ingedekt ? Of zijn er nog manieren om toch door deze beveiliging heen te komen en eventueel mijn MySQL-queries te beïnvloeden ?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Ken je de functie preg_match? Het één voor één checken van karakters in je string is niet bevorderlijk voor de performance.
Door slechts enkele dingen toe te staan ben je tegen het meeste wel ingedekt. Door geen slashes toe te staan is de hele addslashes trouwens overbodig. Waar je wel op moet letten is wanneer het om een numerieke waarde gaat. Hier zet je in je query geen quotes omheen, terwijl je op deze manier wel een niet-numerieke waarde toestaat.

Acties:
  • 0 Henk 'm!

Anoniem: 14829

Ben ik met deze functie tegen elk type invoer ingedekt ?
Je bent pas tegen SQL injection ingedekt wanneer je geparametriseerde queries gebruikt. Dus nooit een query opbouwen die deels bestaat uit jouw code en deels uit user input. Die user input stop je in de parameters van jouw query.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 08:36
Kijk eens naar mysql_escape_string() ?

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 10:25
Als ik alleen een getal wil hebben dan is de regel
PHP:
1
if ( $Char == 32 || $Char == 45 || $Char == 46 || $Char == 64 || $Char == 95 || ( $Char >= 48 && $Char <= 57 ) || ( $Char >= 65 && $Char <= 90 ) || ( $Char >= 97 && $Char <= 122 ) )

vervangen door
PHP:
1
if ( ( $Teller1 == 0 && $Char == 45 ) || ( $Char >= 48 && $Char <= 57 ) )


Ik zal nog in de php-code onderzoeken of getallen netjes worden afgehandeld.

Speel ook Balls Connect en Repeat