[php] gevaarlijke tekens

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Door schade en schande heb ik in het verleden geleerd dat je de input van je tekstvelden en textarea's goed moet checken alvorens deze terug te posten bij een foutmelding, te mailen of op te slaan in de database.

Ik moet eigenlijk bekennen dat ik daardoor een beetje paranoia ben geworden. Ik gooi er een hele zooi checks overheen.

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
function strip_quotes($value) {
    $value = eregi_replace("\"","“",$value);
    $value = eregi_replace("'","‘",$value);
    $value = eregi_replace(" +", " ",$value);
    return $value;
}

$search = array ("'<script[^>]*?>.*?</script>'si",  // Strip out javascript
                 "'<[\/\!]*?[^<>]*?>'si",          // Strip out HTML tags
                 "'([\r\n])[\s]+'",                // Strip out white space
                 "'&(quot|#34);'i",                // Replace HTML entities
                 "'&(amp|#38);'i",
                 "'&(lt|#60);'i",
                 "'&(gt|#62);'i",
                 "'&(nbsp|#160);'i",
                 "'&(iexcl|#161);'i",
                 "'&(cent|#162);'i",
                 "'&(pound|#163);'i",
                 "'&(copy|#169);'i",
                 "'&#(\d+);'e");                    // evaluate as php
//
$replace = array ("",
                 "",
                 "\\1",
                 "\"",
                 "&",
                 "<",
                 ">",
                 " ",
                 chr(161),
                 chr(162),
                 chr(163),
                 chr(169),
                 "chr(\\1)");

$achternaam = stripslashes($achternaam);
$achternaam = strip_quotes($achternaam);
$achternaam = preg_replace ($search, $replace, $achternaam);
$achternaam = htmlentities ($achternaam);


Ik dacht dat je met htmlentities helemaal op save speelde, soms lastig dat speciale letters zoals é in hun nummercode worden weergegeven, maar je weet dan tenminste zeker dat het allemaal in de database beland.

Deze checks doe ik voornamelijk voor het strippen van html, js, php, whitespace maar natuurlijk ook voor de beruchte ' (quote) en " (dubbelquote).

Wat schertst mijn verbazing nu ! Ik vul toevallig een ander (beetje quote achtig) teken in: ’ (& #8217;) en de hele bende loopt vast. Het lukt me niet om deze eruit te filteren als ik een nieuwe replace toevoeg in de functie strip_quotes en htmlentities pakt 'm dus blijkbaar ook niet. Maar alles loopt er wel op vast ! Wat moet ik hieraan doen.

Kent iemand dit probleem ? Of beter nog een oplossing ?

vriendelijke groet

[ Voor 28% gewijzigd door Verwijderd op 04-11-2004 09:24 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Kan je daarvoor juist niet addslashes gebruiken ?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
BtM909 schreef op 04 november 2004 @ 09:26:
Kan je daarvoor juist niet addslashes gebruiken ?
Ik ben meer voor het gebruik van een database specifieke functie om waarde te escapen. Dus mysql_(real_)escape_string voor MySql en sqlite_escape_string voor Sqlite bijvoorbeeld. Omdat niet iedere database dezelfde gevoellige tekens heeft.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Om de code terug te geven in een html-pagina moet je de html-entities omzetten (htmlspecialchars is meestal voldoende, htmlentities is evt wat uitgebreider, niet per se beter). Dat geldt zowel voor het tonen in een textarea of ander veld, als als parameter bij een tag (value van een input bijv).
Let erop dat de ' ook geescaped wordt als je de parameter met ' omsluit (dat kan je met speciale parameters aan htmlspecialchars en htmlentities doen).

Voor de database kan je het beste van de htmlentities afblijven, tenzij je later de inhoud van je db rechtstreeks wilt kunnen tonen, zonder tussenstappen, dan htmlspecialchars/htmlentities en daarna de gebruikelijke db-escaping. Die gebruikelijke escaping is bij DB's (SQL-standaard) de ' dubbel uitvoeren naar '' en soms staan ze andere vormen van escaping toe (' -> \' enzo).

Bij de wat "grotere" talen heb je voor de db-escaping overigens vaak de beschikking over prepared statements, waarmee alle specifieke escaping, conversies etc voor je gedaan worden.
Bij php heb je daar de *_escape_string-functies voor, soms moet er wat meer geescaped worden dan alleen de ' (nul-karakters bijv).

Voor e-mailen heb je overigens in principe geen escaping nodig, tenzij je daar natuurlijk weer html-content in plaatst.

[ Voor 6% gewijzigd door ACM op 04-11-2004 14:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor jullie reacties.

Ik denk dat mijn checks wel voldoende zijn. Ik filter alle backslashes eruit en zet de single en double quote om naar de in mijn ogen onschuldige “ (& ldquo;) en ` (& lsquo;).

Echter ik loop tegen een zeer vreemd probleem aan.

Ik heb een formulier pagina en een formhandle pagina. Als men het formulier post dan checkt de formhandle of alles goed is ingevuld en wordt alles eventueel per email verzonden en in de database opgeslagen. Als niet alles goed is ingevuld wordt alle data middels hidden form fields terug gestuurd naar het formulier zodat mensen hun fouten kunnen verbeteren.

Als men nu single of double quotes invuld en post is er niets aan de hand. Als men dan wordt terug geleid naar het formulier zijn inmiddels de quotes vervangen. Als men daarna het formulier weer post dan loopt formhandle vast in een blanco pagina. De hidden form fields zijn wel gepost maar niet de formtag zelf met de action,method,name etc. Daarom komt er een js error omdat js het 'niet bestaande' formulier niet kan verzenden.

Wanneer ik met de backbutton terug ga naar het formulier en vervolgens de “ (& ldquo;) en ` (& lsquo;) weghaal uit het formulier haal en post, gaat het wel goed.

Het bovenstaande gebeurt bij mij in IE (6.0.29). Met firefox is er geen vuiltje aan de lucht. Ondertussen wordt het formulier wel steeds ingevuld door bezoekers dus ik krijg het idee dat alleen ik of enkelen dit probleem hebben. Of misschien komt dit probleem toch vaker voor en loop ik nu veel inschrijvingen mis !

Het lijkt er dus op dat IE niet overweg kan met “ (& ldquo;) en ` (& lsquo;) in een formulier.

Iemand een idee wat hier speelt ?

[ Voor 12% gewijzigd door Verwijderd op 08-11-2004 11:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ACM schreef op 04 november 2004 @ 14:31:

Bij de wat "grotere" talen heb je voor de db-escaping overigens vaak de beschikking over prepared statements, waarmee alle specifieke escaping, conversies etc voor je gedaan worden.
Bij php heb je daar de *_escape_string-functies voor, soms moet er wat meer geescaped worden dan alleen de ' (nul-karakters bijv).
Vanaf php5 icm de mysqli extensie en Mysql 4.1(is stable nu als het goed is) kan er al gebruik worden gemaakt van prepared statements. Ik ga me daar van de week eens in verdiepen of het nut heeft bij MySQL omdat bij 4.1 de execution plans nog niet worden gecached afaik. Dat komt pas vanaf versie 5.

Ik zal vanavond voordat Star Trek begint eens ernaar kijken. Op zich moet het best lekker werken :9

Acties:
  • 0 Henk 'm!

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
Ik dacht dat PEAR::DB dit allemaal deed. Zit standaard in je PHP installatie.
Pagina: 1