[fixed] Filteren POST data

Overzicht

Sponsored by: Vacatures door Monsterboard

26/05/2010 23:58:23
Anchor link
Omdat blijkbaar het vorige topic dicht moest omdat het 'afgehandeld' was open ik hier maar een nieuwe:
Martijn:
Goed dat PHPhulp weer werkt,
mooie simpele site zo zie ik een website het liefst.

Ik moest een nieuw wachtwoord aanvragen dus knip en plak ik deze uit mijn E-mail. Alleen ik had de 1e keer niet in de gaten dat er een spatie meegenomen werd (na de 2e keer ook niet trouwens).

Volgens mij mag je POST (alles wat in superglobal zit) gewoon trimmen.
Nog nooit klachten over gehad.

Ik gebruik zelf een filter voor superglobals deze roept voor iedere waarde (key trouwens ook) onderstaande methode aan. Kijk maar wat jullie er mee doen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/**
 * Geeft een variabele het juiste type
 * en vervangt wat zaken in de variabele.
 *
 * @param mixes $_mVar            | Mixed input
 * @param boolean $_bMultibyte    | Does $_mVar hold a multibyte string. (default false)
 * @return mixed
 *
 * @access private
 *
 * Notes:
 *    -
 */

private function _set_var(    $_mVar,
                $_bMultibyte = false )
{

    if( $_mVar === 0
        || $_mVar === ''
        || !is_string($_mVar) )
    {

        return $_mVar;
    }


    $_mVar = trim(htmlspecialchars(str_replace(array("\r\n", "\r", "\0"), array("\n", "\n", ''), $_mVar), ENT_COMPAT, 'UTF-8'));

    if( $_mVar )
    {

        if( $_bMultibyte )
        {

            # Make sure multibyte characters are wellformed
            if( !preg_match('/^./u', $_mVar) )
            {

                $_mVar = '';
            }
        }

        else
        {
            # Unicode: Basic Latin (00–7F)
            #          Latin-1 Supplement (80–FF)

            # No multibyte, allow only ASCII (0-127)

            $_mVar = preg_replace('/[\x80-\xFF]/', '?', $_mVar);
        }
    }


    if( $this->_bMagicQuotesGPC )
    {

        $_mVar = stripslashes($_mVar);
    }


    return $_mVar;

}
# End method _set_var
?>

Dat was dus de topic start, toen kwam deze reactie van Bas:
Bas:
Bedankt voor de tip! Maar stel dat iemand nou een spatie in zijn wachtwoord wil?

Tja, stel iemand wilt een spatie in z'n wacht woord. Goh, dan moeten we eerst maar eens opzoeken wat trim doet...
http://php.net/trim:
This function returns a string with whitespace stripped from the beginning and end of str. Without the second parameter, trim() will strip these characters:
" " (ASCII 32 (0x20)), an ordinary space.
"\t" (ASCII 9 (0x09)), a tab.
"\n" (ASCII 10 (0x0A)), a new line (line feed).
"\r" (ASCII 13 (0x0D)), a carriage return.
"\0" (ASCII 0 (0x00)), the NUL-byte.
"\x0B" (ASCII 11 (0x0B)), a vertical tab.

Oh zit dat zo! Dus alleen witruimte om een string heen. Die php.net documentatie is natuurlijk niet te vertrouwen (waarom zou je ook hé, allemaal onzin die officiële documentatie, gewoon de boel in elkaar hacken tot je er bij neer valt). Daarom gaan we natuurlijk even een testcaseje, dan kunnen we de boel lekker visualiseren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php // Kleurtjes, ik houd zo van kleurtjes, wat moet ik toch zonder jullie, kleurtjes
$blaat1 = '                blaat-met-witruimte-ervoor';
$blaat2 = 'blaat-met-witruimte-erachter              ';
$blaat3 = '        blaat-met-witruimte-omheen        ';
$blaat4 = '    blaat met witruimte erin en omheen    ';
// Oh, zie mij eens stoer bovenstaande uitlijnen!
// Nu we onze teststrings hebben gaan we de boel uitvoeren:

$blup1 = trim($blaat1);
$blup2 = trim($blaat2);
$blup3 = trim($blaat3);
$blup4 = trim($blaat4);
// Natuurlijk hadden we array's kunnen gebruiken
// Maar dan had ik niet zovaak blaat en blup
// kunnen schrijven :-(

var_dump($blaat1, $blaat2, $blaat3, $blaat4, $blup1, $blup2, $blup3, $blup4);
// Var_dump geeft ons:
/* Multiline comment
string(42) "                blaat-met-witruimte-ervoor"
string(42) "blaat-met-witruimte-erachter              "
string(42) "        blaat-met-witruimte-omheen        "
string(42) "    blaat met witruimte erin en omheen    "
string(26) "blaat-met-witruimte-ervoor"
string(28) "blaat-met-witruimte-erachter"
string(26) "blaat-met-witruimte-omheen"
string(34) "blaat met witruimte erin en omheen"
*/
// Ik wil jou niet afsluiten
?>

Goh, wat blijkt nu, alle witruimte om een tekstje wordt weggehaald. Wat lief. En alle witruimte in een tekstje blijft staan.
Nu weten we wel wat er gebeurd, maar hoe zit dat nu bij een wachtwoord? Dat moet twee keer ingevuld worden...
Nouw heb je wel eens op school vergelijkingen opgelost?
Zoals dit (wel makkelijk houden hé):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php // Blijkbaar werkt die stomme ubb parser alleen als ik jou open ofzo
2x + 4 = 12
    2
x = 8 // Oh zie je dat, ik heb beide kanten -4 gedaan
     x = 4 // Kijk nouw eens, alles gedeeld door twee, en dat is het resultaat!
// En jou weer verplicht sluit
?>

Dit zelfde principe geldt dus ook voor het wachtwoord. Als je gewoon consequent overal op alle input trim doet (en dan ook nog eventueel htmlspecialchars), dan is er echt niks aan de hand, want dan komt gewoon het getrimde wachtwoord in de database. Wanneer iemand dan inlogt, met z'n spaties ervoor / -achter, dan wordt dat ook weer getrimt, dus is dat weer gelijk aan het wachtwoord wat in de database staat (want die was ook getrimt).
(Jah, zeikerds en mierenneukers, je moet de wachtwoorden gehashed met salts in de db opslaan.)
Gewijzigd op 03/06/2010 11:14:03 door B a s
 
PHP hulp

PHP hulp

24/12/2024 18:10:36
 
Wesley Overdijk

wesley Overdijk

27/05/2010 07:57:24
Anchor link
Leuk om te lezen dit :p
 

27/05/2010 09:40:41
Anchor link
Wesley:
Leuk om te lezen dit :p


Ik ben blij dat jij dit leuk vind :-)!
 
Martijn B

Martijn B

30/05/2010 11:48:43
Anchor link
Je geeft mij dus gelijk, ik dacht al :P

Bovenstaande functie is gewoon uit PhpBB geript (lang geleden alweer), zij filteren ook alle gebruikers invoer (GET, POST, SERVER) dit neemt je heel erg veel werk uit handen. Omdat alles wat in de database staat veilig is om gelijk op het scherm te zetten (zonder dat je nog eens htmlspecialchars() moet gebruiken).

Ook worden de gegevens vertaald naar 1 karakterset (UTF-8), dit zou ook nog eens problemen kunnen voorkomen, denk ik.
 
B a s
Beheerder

B a s

03/06/2010 11:13:45
Anchor link
Fixed
 
 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.