Johnny B.: RegEx Maskierung

Hallo geehrtes Forum,

folgendes Matching verlangt nach der Maskierung der bedeutungsschwangeren Zeichen in $check (so denn welche darin vorhanden sind):

next if $ding =~ /$check/;

Ich habe jetzt eine Sub geschrieben, die das für mich erledigt:

sub mask {
    my $string = shift;
    $string =~ s/([?.\+\*^$|\()[]{}])/\$1/g;
    return $string
}

das ergibt dann:

$check = mask( $check );
next if $ding =~ /$check/;

Ich habe den Eindruck, daß dies auch viel einfacher geht, vielleicht mit einem Maskierungsflag oder so?

Besten Gruß
JOhnnY

  1. Hi,

    Ich habe den Eindruck, daß dies auch viel einfacher geht, vielleicht mit einem Maskierungsflag oder so?

    Oder quotemeta nutzen oder so …?

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hallo ChrisB,

      Oder quotemeta nutzen oder so …?

      ha, cool! Und wenn ich ein unschuldiges - oder ein ' oder so maskiere, hat es auf das Matching keinen Einfluß?

      So!
      JOhnnY

      1. ha, cool! Und wenn ich ein unschuldiges - oder ein ' oder so maskiere, hat es auf das Matching keinen Einfluß?

        Ja, probier es doch mal selber aus. Hu, spät, bzw. nu schon wieder früh isses. Also 's funzt, um es mal so zu sagen.

        Aber es scheint ja auch genau dafür gemacht zu sein.

  2. Hi,

    $string =~ s/([?.\+\*^$|\()[]{}])/\$1/g;

    Hm. Soweit ich weiß, muß innerhalb der Zeichenklasse [] fast gar nichts maskiert werden: '-' wenn es nicht am Anfang (nach ggf. vorhandenem ^) oder Ende steht, ']' wenn es nicht am Anfang (nach ggf. vorhandenem ^ steht), '' immer.

    Deine Zeichenklasse enthält zweimal den escapeten \ (nach dem Punkt und nach dem |. Das + hast Du nicht escapet.

    Außerhalb einer Zeichenklasse könnte \Q ... \E was für Dich sein. Aber in der Zeichenklasse geht das natürlich nicht. Ist ja auch nicht notwendig.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Hallo geehrtes Forum,

    gibt es sowas auch entsprechend für mySQL?

    Ich kenne das hier:

    my $inhalt = "hallo'hallo";
    $inhalt    = $db_go->quote( $inhalt );
    my $sql    = "INSERT INTO tabelle SET feld = $inhalt";
    my $db     = $db_go -> prepare( $sql );

    Das funktioniert prima, ist jedoch für einen längeren Query-String mit vielen Feldern recht aufwendig, da jedes Feld einzeln gequoted werden muß. Ich suche eine Funktion (Regex?), die den kompletten Querystring quoten kann. Quasi so:

    my $inhalt1 = "hallo'hallo";
    my $inhalt2 = "welt'welt";
    my $sql     = "INSERT INTO tabelle SET feld1 = '$inhalt1', feld2 = '$inhalt2'";
    $sql = quote( $sql );

    => $sql = "INSERT INTO tabelle SET feld1 = 'hallo'hallo', feld2 = 'welt'welt'";

    Gibt's sowas?

    Besten Gruß
    JOhnnY

    1. gibt es sowas auch entsprechend für mySQL?

      Nicht für mysql, aber du kannst mit dem DBI Modul auch Parameter binden und diese werden dann automatisch gequotet.

      Struppi.

      1. Moin Moin!

        du kannst mit dem DBI Modul auch Parameter binden und diese werden dann automatisch gequotet.

        Das hat noch weitere Vorteile:
        * SQL Injection fällt vollkommen flach, sofern der jeweilige DBD bzw. das darunter liegende DB-Interface nicht vollkommen schlampig programmiert ist.
        * Caching der SQL-Statements wird so überhaupt erst möglich (prepare_cached).
        * Absolut kein Theater mit dem Quoting von Werten, weil sich DBI darum kümmert.

        Übrigens funktionieren Platzhalter bei DBI auch mit Datenbanken, die von sich aus keine Platzhalter unterstützen, hinter den Kulissen kümmert sich DBI darum, die Werte passend zu quoten und in das SQL-Statement einzufügen. Normalerweise reicht aber der DBD das SQL direkt an die DB weiter, und reicht die Parameter in einem zweiten Schritt weiter, ohne dass überhaupt ein Quoting notwendig ist. Das macht dem SQL-Parser auf der DB-Seite das Leben natürlich auch leichter.

        Es gibt also in aller Regel keinen vernünftigen Grund, keine Platzhalter einzusetzen.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".