[php] preg_match fout

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer met de onderstaande preg_match alle html uit mijn field entries te halen, echter krijg ik de error, " Compilation failed: missing terminating ] for character class at offset 31"

code:
1
2
3
4
5
6
7
$html = "/[^a-zA-Z0-9\.\-\Ä\ä\Ö\ö\Ü\ü\]+$/s";
if (preg_match($html, $fname) || preg_match($html, $fsurname) || preg_match($html, $fresidence) || preg_match($html, $fcountry) || preg_match($html, $fzip) || preg_match($html, $ftel) || preg_match($html, $femail) || preg_match($html, $fspeciality) || preg_match($html, $comments)) {
}
else {
echo "<div id='newscontent'>Only these characters are allowed.</div>";
$error++;
}


Ik heb al meerdere preg_match voorbeelden gebruikt. Helaas kom ik er niet uit (half uur zitten rotzooien). Het liefste filter ik alleen tekens zoals /\<>&*()#$ etc, maar het bovenstaande voldoet wat dat betreft prima als het werkt.

Wat veroorzaakt het probleem?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De ] wordt voorafgegaan door een escape character en dus niet als einde van de char class gezien.

[ Voor 31% gewijzigd door Voutloos op 26-08-2008 14:40 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Kan je niet iets van htmlspecialchars gebruiken ?

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

En als ik nu een letterlijke '<' wil typen? Moet ik dan een entiteit gaan gebruiken ofzo (wat ook niet kan want '&' en ';' zijn ook niet geldig blijkbaar).

Waarom zorg je niet gewoon dat alles zo escaped wordt dat HTML invoer geen kwaad kan?

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op dinsdag 26 augustus 2008 @ 14:40:
De ] wordt voorafgegaan door een escape character en dus niet als einde van de char class gezien.
Hoe moet de sequence dan herschreven worden? Ik zie vrijwel alleen maar voorbeelden met escape characters.

@crisp, waarom zou je html in namen etc willen gebruiken ;).

[ Voor 4% gewijzigd door Verwijderd op 26-08-2008 14:58 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op dinsdag 26 augustus 2008 @ 14:52:
[...]


Hoe moet de sequence dan herschreven worden? Ik zie vrijwel alleen maar voorbeelden met escape characters.

@crisp, waarom zou je html in namen etc willen gebruiken ;).
in namen wellicht niet, maar ik zie ook een $comments enzo...

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op dinsdag 26 augustus 2008 @ 15:00:
[...]

in namen wellicht niet, maar ik zie ook een $comments enzo...
Ook daar mag geen html in. Het is een simpel lijstje van deelnemers, comments worden enkel en alleen opgeslagen in een database voor de admin zelf.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 26 augustus 2008 @ 14:52:
[...]


Hoe moet de sequence dan herschreven worden? Ik zie vrijwel alleen maar voorbeelden met escape characters.

@crisp, waarom zou je html in namen etc willen gebruiken ;).
sorry tweakers :P
je characterclass moet beginnen met [ en eindigen met ].
als je de ] escaped dmv \] gaat het niet goed

$html = "/[^a-zA-Z0-9\.\-\Ä\ä\Ö\ö\Ü\ü]+$/s";

Acties:
  • 0 Henk 'm!

  • Miguel
  • Registratie: Februari 2007
  • Laatst online: 10:03
Ik gebruik altijd deze snippet voor het controleren van zulke velden,
PHP:
1
2
3
4
5
6
7
8
9
10
11
function controleerOpbouwString( $s_pattern, $s_waarde ){

    if( eregi( $s_pattern, $s_waarde ) === 1 ){

        return true;

    } 

    return false;

}


En dan controleren met behulp van onderstaand pattern;
PHP:
1
$s_pattern = '^[a-z éèàäöïüç\.\-]{3,}$'; # Min 3, max ... zelf invullen ;)


Dan krijg je dit bv als je het ingewerkt hebt;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[0] Voornaam "Miguel" is juist!
[1] Voornaam "<HAX>Miguel</HAX>" is fout!
[2] Voornaam "Fréderic" is juist!
[3] Voornaam "Fançy Kabouter Plop" is juist!
[4] Voornaam "<script>alert("kek");</script>" is fout!
[5] Achternaam "Derese" is juist!
[6] Achternaam "Van De Mortele" is juist!
[7] Achternaam "Iets.Met-Streepjes.enPuntjes" is juist!
[8] Achternaam "Iets~!goed?Fout!" is fout!
[9] Achternaam "hmmm?" is fout!
[10] Achternaam "1" is fout!
[11] Achternaam "gd" is fout!
[12] Achternaam "" is fout!
[13] Achternaam "OoOOoOoOOO" is juist!


En ben ik nu mis of doe jij daar iets heel raar?
Ik werk wel nooit met preg_match maar;
PHP:
1
2
if (preg_match($html, $fname) || preg_match($html, $fsurname) || preg_match($html, $fresidence) || preg_match($html, $fcountry) || preg_match($html, $fzip) || preg_match($html, $ftel) || preg_match($html, $femail) || preg_match($html, $fspeciality) || preg_match($html, $comments)) {
}

Dus als de eerste preg_match een match gevonden heeft stop hij gewoon? en ga je verder?
Dus ik voer alleen mijn voornaam goed in en al de rest van de velden interesseert mij niet :+ !
Das zoiets als ;
PHP:
1
2
3
4
5
6
7
8
9
10
# PHP denkwerk
if( true /* 1 (Match) */ || voer_ik_lekker_niet_meer_uit || voer_ik_lekker_niet_meer_uit ) {

   # Doe iets goed

} else {

   # Fout!

}


Correct me if i'm wrong }:O

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Waarom gebruik je geen strip_tags() eigenlijk?

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
En ben ik nu mis of doe jij daar iets heel raar?
Klopt idd, daar doe ik iets wat ik niet had moeten doen. Hij vond het idd wel best als er 1 match was, en dat is niet de bedoeling.

Ik probeer nu zoiets als dit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function checkhtml($var){
                                 if (preg_match ("", $var)){
                                                 echo("<p><b>bevat onzin</b><p>");
                                                 $error++;
                                                 }
                                 }

checkhtml($fname);
checkhtml($fsurname);
checkhtml($fresidence);
checkhtml($fcountry);
checkhtml($fzip);
checkhtml($ftel);
checkhtml($fspeciality);
checkhtml($fcomments);


Hiermee krijg ik dus per functie check wel een antwoord. Nu heb ik alleen nog een werkende preg_match nodig voor de volgende tekens /\?<>().

[ Voor 3% gewijzigd door Verwijderd op 26-08-2008 17:56 ]


Acties:
  • 0 Henk 'm!

  • Miguel
  • Registratie: Februari 2007
  • Laatst online: 10:03
Maar ik snap nu nog niet echt wat je wil?

Als je wil dat hij de input gaat opkuisen stel ik zoiets voor; ( Volgens jouw tekenreeks, /\?<>() )
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
<?php

function checkhtml($s_waarde){

    # Kuis string op de volgende tekens; /\?<>()
    return preg_replace('(\/|\\\|\?|\<|\>|\(|\))', '', $s_waarde);

    # Of deze, je zou eens moeten uitzoeken welke de snelste is?
    # return str_replace( array('/','\\','?','<','>','(',')'), '', $s_waarde);

}

# Input uit het formulier
$fname = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fsurname = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fresidence = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fcountry = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fzip = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$ftel = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fspeciality = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';
$fcomments = '<<<<<<<<<<Miguel<script>Met(Haakjes)enOok\Slashes/';

# Variabelen opkuisen en tonen op het scherm
print $fname = checkhtml($fname) . '<br />';
print $fsurname = checkhtml($fsurname) . '<br />';
print $fresidence = checkhtml($fresidence) . '<br />';
print $fcountry = checkhtml($fcountry) . '<br />';
print $fzip = checkhtml($fzip) . '<br />';
print $ftel = checkhtml($ftel) . '<br />';
print $fspeciality = checkhtml($fspeciality) . '<br />';
print $fcomments = checkhtml($fcomments) . '<br />';

# Alles is ( normaalgezien 8-] ) opgekuist

?>


Bovenstaande zal dit als output geven;
code:
1
2
3
4
5
6
7
8
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes
MiguelscriptMetHaakjesenOokSlashes


Als je wil controleren of de velden geldig zijn ingevuld en anders een foutmelding wil gooien moet je eens naar de code in mijn vorige post kijken. ( Die raad ik je ook aan )

Maar ik zou zoiets nooit doen eigenlijk. In mijn ogen is het beter te zeggen tegen de gebruiker dat hij een veld niet geldig ingevuld heeft en hem vragen om aan te passen. Nu schrijf je eigenlijk iets weg naar de database dat niet naar de wensen is van de nietsvermoedende gebruiker :9

[ Voor 3% gewijzigd door Miguel op 26-08-2008 18:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De volledige code steekt nu al zo in elkaar dat de gebruiker per veld netjes de mededeling krijgt dat de invoer ongeldig is, maar als ik jouw preg match gebruik is < en > nog altijd toegestaan. Haakjes en slashes worden wel gepakt. Wat veroorzaakt dit?

code:
1
2
3
4
if (preg_match ('(\/|\\\|\?|\<|\>|\(|\))', $var))
                                                 return true;
                                                 else
                                                 return false;

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

ik ben eigenlijk meer voor wat Crisp zegt maar als het dan toch met een regex moet dan kijk eens naar \w

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
iH8 schreef op dinsdag 26 augustus 2008 @ 19:02:
ik ben eigenlijk meer voor wat Crisp zegt maar als het dan toch met een regex moet dan kijk eens naar \w
dat pakt : ook? dat is dan weer niet de bedoeling :)

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Verwijderd schreef op dinsdag 26 augustus 2008 @ 19:16:

dat pakt : ook? dat is dan weer niet de bedoeling :)
nope:
\w - Word character - A single word character represents all the characters of the alphabet, numbers 0-9 and the underscore character.

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb juist \W nodig.

Match any single non-word character. Equivalent to [^a-zA-Z0-9_].

Het gaat er juist om dat ik <>?()/\ uit een string kan herkennen en vervolgens TRUE kan gebruiken voor een error count per string.

Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
Wat is er nu het probleem met de <>' en " ??

Echt serieus, ik snap nooit waarom mensen die wanhopig gaan verwijderen en escapen en whatever. Ik zet ze gewoon om naar een entity, en daarmee is de kous af? Tuurlijk wil ik ook bepaalde dingen niet in namen enzo, maar de <>' " tekens zijn geen probleem IMO.

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
link0007 schreef op dinsdag 26 augustus 2008 @ 19:42:
Wat is er nu het probleem met de <>' en " ??

Echt serieus, ik snap nooit waarom mensen die wanhopig gaan verwijderen en escapen en whatever. Ik zet ze gewoon om naar een entity, en daarmee is de kous af? Tuurlijk wil ik ook bepaalde dingen niet in namen enzo, maar de <>' " tekens zijn geen probleem IMO.
het probleem op dit moment is < en >. Zoals eerder gegeven werkt het onderstaande niet volledig.

code:
1
if (preg_match ('(\/|\\\|\?|\<|\>|\(|\))', $var))

Acties:
  • 0 Henk 'm!

Verwijderd

mocean schreef op dinsdag 26 augustus 2008 @ 16:15:
Waarom gebruik je geen strip_tags() eigenlijk?
Wat hij zegt: http://nl.php.net/strip-tags

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Omdat ik geen html tags wil strippen ;). Een spambot wil www.viagra.com invoeren, krijgt geen foutmelding maar kan toch lekker troep in de database gooien. Daar heb ik dus geen zin in. Het zou dus leuk zijn als het eerder genoemde wel <> kan herkennen. Mijn script werkt volledig, behalve <>. Please ontopic houden mbt dit probleem.

[ Voor 7% gewijzigd door Verwijderd op 26-08-2008 19:59 ]


Acties:
  • 0 Henk 'm!

  • Miguel
  • Registratie: Februari 2007
  • Laatst online: 10:03
Ik weet niet hoe je die code geïmplementeerd hebt maar bij mij doet ie het gewoon?
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
<?php

function isGeldig($s_waarde){

    # Indien pregmatch 0 teruggeeft (geen teken gevonden uit /\?<>() );
    if ( preg_match( '(\/|\\\|\?|\<|\>|\(|\))', $s_waarde ) === 0 ){

        return true;

    } 

    return false;

}

print 'Miguel, is ' . ( ( isGeldig('Miguel') ) ? 'Geldig' : 'fout' ) . '<br/>';
print 'Miguel Derese, is ' . ( ( isGeldig('Miguel Derese') ) ? 'Geldig' : 'fout' ) . '<br/>';
print 'Miguel\\/, is ' . ( ( isGeldig('Miguel\\/') ) ? 'Geldig' : 'fout' ) . '<br/>';
print 'Miguel(), is ' . ( ( isGeldig('Miguel()') ) ? 'Geldig' : 'fout' ) . '<br/>';
print 'Mig(uel, is ' . ( ( isGeldig('Mig(uel') ) ? 'Geldig' : 'fout' ) . '<br/>';
print 'Miguel-., is ' . ( ( isGeldig('Miguel-.') ) ? 'Geldig' : 'fout' ) . '<br/>';
print '&lt;Miguel&lt;&gt;, is ' . ( ( isGeldig('<Miguel<>') ) ? 'Geldig' : 'fout' ) . '<br/>';
print '??Miguel&gt;?, is ' . ( ( isGeldig('??Miguel?') ) ? 'Geldig' : 'fout' ) . '<br/>';

?>


Geeft
code:
1
2
3
4
5
6
7
8
Miguel, is Geldig
Miguel Derese, is Geldig
Miguel\/, is fout
Miguel(), is fout
Mig(uel, is fout
Miguel-., is Geldig
<Miguel<>, is fout
??Miguel>?, is fout

[ Voor 27% gewijzigd door Miguel op 26-08-2008 21:08 . Reden: Commentaar toch maar weggehaald ... ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Edit:

een eerdere gebruikte functie gooide roet in het eten, namelijk
trim(strip_tags(htmlspecialchars($data)). Ik had het moeten weten :o

[ Voor 187% gewijzigd door Verwijderd op 26-08-2008 21:30 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Verwijderd schreef op dinsdag 26 augustus 2008 @ 19:58:
[...]


Omdat ik geen html tags wil strippen ;). Een spambot wil www.viagra.com invoeren, krijgt geen foutmelding maar kan toch lekker troep in de database gooien. Daar heb ik dus geen zin in. Het zou dus leuk zijn als het eerder genoemde wel <> kan herkennen. Mijn script werkt volledig, behalve <>. Please ontopic houden mbt dit probleem.
Dan doe je:

PHP:
1
2
3
4
5
6
if ($input == strip_tags($input))
{
  //goed
} else {
  //fout
}

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mocean schreef op dinsdag 26 augustus 2008 @ 21:49:
[...]

Dan doe je:

PHP:
1
2
3
4
5
6
if ($input == strip_tags($input))
{
  //goed
} else {
  //fout
}
zou je dat op 1 of andere manier in een functie kunnen verwerken?

PHP:
1
2
3
4
5
6
7
8
function checkhtml($varhtml){ 
                                if ($varhtml == strip_tags($varhtml)) 
                                    return true;
                                    else 
                                    return false;
                                } 

checkhtml($fname);

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je hebt het net gedaan. ;)
(overigens kan je ook gewoon meteen return $varhtml == strip_tags($varhtml); opschrijven, maar dat is meer stijl geneuzel. :+

Maar goed, er zijn dus standaard functies voor, er is reeds een aantal genoemd, en de rest is te vinden via de 'See also' funcs in de manual. En als je het dan toch zelf wil uitvinden zorg dan gewoon dat je de regex syntax begrijpt (zie fout startpost en uitleg 1e reactie), en denk goed na over de restricties die je mensen oplegt. Want je beperkt dus niet alleen invoer van html, maar je zorgt er ook voor dat mensen uberhaupt deze tekens niet kunnen gebruiken. En dat wou Crisp al duidelijk maken, maar je staart je blind op de html context. :z

{signature}

Pagina: 1