RegExp

Hallo zusammen,

ich arbeite zum ersten mal mit Größeren Regular Expressions, nun habe ich dazu noch ein paar fragen.

Und zwar habe ich eine Variable die nur aus Folgenden Werten bestehen darf:

{tage}
{pers}
0-9
\* / + -

Im Endefekt soll überprüft werden ob die Variable eine Mathematische Rechnung ist.

Aktuell habe ich Folgende Syntax für das Suchmuster:

/^(((\{tage\}$|\{tage\}[\+\*\/\-])|(\{pers\}$|\{pers\}[\+\*\/\-])|([0-9]{1,}$|[0-9]{1,}[\+\*\/\-])){2,})/

Nun sind folgende 2 Probleme aufgetaucht:

Was ist wen ein Rechenwert negativ ist?
z.Bsp.: 2*1±1

Wie kann ich verhindern das an letzter Stelle ein Mathematisches Zeichen steht?
z.Bsp.: 2*2*

Hat jemand ein paar Tipps / Ideen für mich?

Gruß
Phillip

Hallo

ich arbeite zum ersten mal mit Größeren Regular Expressions,
nun habe ich dazu noch ein paar fragen.
Und zwar habe ich eine Variable die nur aus Folgenden Werten
bestehen darf:

{tage}
{pers}
0-9
* / + -

Das ist zu unspezifisch. Kannst Du ein
paar reale Kombinationen, die sein dürfen

  • und die nicht sein dürfen, posten?
    So etwa, um die jeweiligen „Grenzwerte“
    zu skizzieren.

Im Endefekt soll überprüft werden ob die Variable eine
Mathematische Rechnung ist.
Aktuell habe ich Folgende Syntax für das Suchmuster:

/^((({tage … )){2,})/

Nun sind folgende 2 Probleme aufgetaucht:

Was ist wen ein Rechenwert negativ ist?
z.Bsp.: 2*1±1

Was *soll* denn dan sein?

Wie kann ich verhindern das an letzter Stelle ein
Mathematisches Zeichen steht?
z.Bsp.: 2*2*

Was *soll* denn dann sein?

Grüße

CMБ

oki mal ein paar Beispiele:

Richtig:

{tage}\*{pers} 
{tage}/2 
{tag}\*{pers}\*3/2-3 
{pers} 
150 
{tage}+{pers} 
5\*-1

Falsch:

{tage}\*6\*a
{tag}\*2
{tage}//2
{tage}{pers}

Gruß
Phillip

Hallo Phillip,

oki mal ein paar Beispiele:

Beim Rumprobieren hab ich wiedermal mit dem
Kopf geschüttelt was die PHP-Implementierung
betrifft (Plemplementierung :wink:.

Denn: in z.B.: Perl würde ich einfach
ein string-eval() drüberschicken und
Perl selbst würde erkennen was ok ist
und was nicht use strict;
no warnings;

while( ) {
unless ( /^#/ ) {
(my $s = $_) =~ s/{(?:tage|pers)}/1 /g;
eval $s;
print $@ ? „falsch $_“ : „OK $_“
}
}… und dann kommt auch alles korrekt raus.
Beim Umsetzen in PHP:<?php $zeilen = array(
‚# Richtig:‘,
‚{tage}*{pers}‘,
‚{tage}/2‘,
‚{tag}*{pers}*3/2-3‘,
‚{pers}‘,
‚{pers} - -2‘,
‚{pers} + +2‘,
'150 ',
'{tage}+{pers} ',
‚5*-1‘,
‚# Falsch:‘,
‚{tage}*6*a‘,
‚{tag}*2‘,
‚{tage}//2‘,
‚{tage}{pers}‘
);

print "
";
foreach ($zeilen as $z) {
if(! preg_match( ‚/^#/‘, $z )) {
$s = ‚{$___=‘ . preg_replace(’/{(?:tage|pers)}/’,‚1 ‚, $z) . ‚; return 1;}‘;
if( eval( $s ) ) print "OK $z
";
else print "Falsch $z
";
}
}
?>zeigt es sich leider, dass PHP ein „einsames a“
(‘{tage}*6*a‘)als ‚bareword string‘ interpretiert und
natürlich OK liefert. Hmmm.

Ich denke, mit Regex wird man es, wenn
man sich nicht auf ganz wenige Kombinations-
möglichkeiten beschränkt, nicht hinbekommen.

Grüße

CMБ

Hallo,

sowohl in Perl, als auch in PHP solltest du aber tunlichst vor dem eval prüfen, ob da nicht „böse“ Funktionen drin sind . Wenn du {tage} und {pers} durch 1 ersetzt und dann nur [0-9+*/-] zulässt sollte das reichen, aber beliebige Eingaben an eval weiterzugeben ist äußerst gefährlich, könnte ja unlink oder was auch immer drin stehen.

Alexander

Hallo alx

sowohl in Perl, als auch in PHP solltest du aber tunlichst vor
dem eval prüfen, ob da nicht „böse“ Funktionen drin sind.

OK, aber das macht man doch sowieso.

Wenn du {tage} und {pers} durch 1 ersetzt und dann nur
[0-9+*/-] zulässt sollte das reichen, aber beliebige Eingaben
an eval weiterzugeben ist äußerst gefährlich, könnte ja unlink
oder was auch immer drin stehen.

In Perl würde das gar nicht gehen, wenn man,
wie vorgesehen, mit perl -T arbeitet, dann
*dürfte* man strings, die aus der Eingabe kommen,
keiner Funktion übergeben, die „draussen“ etwas
macht. Man muss sie explizit ‚un-tainten‘.

Wie das in PHP ist, kann ich nur vermuten. Es wird
Leute geben, die sowas einbauen woll(t)en, aber
niemals gegen den PHP-Mainstream anrennen können.

Daher muss ich eben wissen, dass ich „fremde“ Strings
in PHP händisch zerlegen muss ehe ich damit irgend
etwas sinnvolles anstellen kann.

In meinen aktuellen Applikationen versuche ich
beim ‚un-tainten‘ sogar herauszufinden, ob der
Versuch einer ‚sql injection‘ stattfand und liefere
daraufhin freundliche Literaturhinweise zur Funktions-
weise dieser Angriffe aus … :wink:

Grüße

CMБ

Hallo Semjon,

Hallo alx

sowohl in Perl, als auch in PHP solltest du aber tunlichst vor
dem eval prüfen, ob da nicht „böse“ Funktionen drin sind.

OK, aber das macht man doch sowieso.

Ja, war auch nur als Ergänzung gemeint, falls der Fragesteller deine eval-Lösung übernimmt.

Wenn du {tage} und {pers} durch 1 ersetzt und dann nur
[0-9+*/-] zulässt sollte das reichen, aber beliebige Eingaben
an eval weiterzugeben ist äußerst gefährlich, könnte ja unlink
oder was auch immer drin stehen.

In Perl würde das gar nicht gehen, wenn man,
wie vorgesehen, mit perl -T arbeitet, dann
*dürfte* man strings, die aus der Eingabe kommen,
keiner Funktion übergeben, die „draussen“ etwas
macht. Man muss sie explizit ‚un-tainten‘.

Im Prinzip ja (so was wie der Taint Mode in Perl wäre mal eine schöne Neuerung für PHP, könnte viele Sicherheitsprobleme vermeiden :wink:), aber durch das s// ist das ja auch in deinem Code ge-un-tainted.

Wie das in PHP ist, kann ich nur vermuten. Es wird
Leute geben, die sowas einbauen woll(t)en, aber
niemals gegen den PHP-Mainstream anrennen können.

Daher muss ich eben wissen, dass ich „fremde“ Strings
in PHP händisch zerlegen muss ehe ich damit irgend
etwas sinnvolles anstellen kann.

Natürlich, aber ich schreibe das lieber hier einmal mehr dazu, auch wenn der Fragesteller es evtl. selbst weiss, als wieder ein unsicheres Script mehr im Netz massenhaft SPAM versendet.

In meinen aktuellen Applikationen versuche ich
beim ‚un-tainten‘ sogar herauszufinden, ob der
Versuch einer ‚sql injection‘ stattfand und liefere
daraufhin freundliche Literaturhinweise zur Funktions-
weise dieser Angriffe aus … :wink:

Möchtest du die evtl. als Ergänzung zu FAQ:2435 schreiben :wink:

Mit freundlichen Grüßen,

Alexander