Martino: Formulardaten übernehmen und säubern

Liebes Forums-Orakel,

mein Perl-Skript liest übermittelte Formularfelder ein und schreib diese in MySQL. Nun ist besonders hinderlich, wenn jemand " Hochkommas eingibt, denn dann wird nichts hineingeschrieben. Ich habe deshalb folgendes geschrieben:

$Frage = $query->param('Frage');
   $Frage  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $Frage =~ s/"/\"/g; #Anf¸hrungszeichen maskieren
   $Frage =~ s/'/\'/g;

Das funktioniert. Dumm nur, dass ich es auf alle möglichen Felder anwenden will, die ganze Wurst aber nicht zig-fach schreiben will.

wie geht das, wenn ich folgendes will:

$Frage = $query->param('Frage');
&form_verarbeiten;

sub form_verarbeiten
{
 (was kann ich hier schreiben?) =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 (was kann ich hier schreiben?) =~  s/"/\"/g; #Anf¸hrungszeichen maskieren
 (was kann ich hier schreiben?) =~ s/'/\'/g;
}

Mit $_ funktioniert das leider nicht.

Vielen Dank, Martino

  1. Moin Moin !

    1. Nimm Dir das DBI-Manual mal vor, denn Du kannst BELIEBIGE Zeichen in die Datenbank schreiben, auch " und '. Du brauchst kein Escaping. Das Geheimnis liegt darin, die Werte eben nicht in das SQL-Statement zu schreiben, sondern separat an die execute-Methode zu übergeben.

    2. Escaping-Funktionen kann man z.B. so schreiben:

    sub escape_it($)
    {
     my $toescape=shift;
     $toescape=~s/......./........../....;
     $toescape=~s/......./........../....;
     $toescape=~s/......./........../....;
     $toescape=~s/......./........../....;
     return $toescape;
    }

    $var1=escape_it(param('p1'));
    $var2=escape_it($var2);

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. Hallo Alexander,

      ich finde es eine gute Idee, die Sub-Routine mit einem übergebenem Wert aufzurufen, da bin ich leider nicht drauf gekommen. Mit dem DBI werde ich mich auch noch befassen, das ist spannend.

      Danke, Martino.