Datenbank-Abfrage von illegalen Zeichen befreien

Hallo,

ich moechte hier mittels eines Skripts Datei-Namen einlesen und diese
dann in eine Datenbank (SQLite 3) schreiben. Dazu verwende ich Perl
5.8.4 und DBI 1.46.

Das Problem sind etwaige Sonderzeichen in den Dateinamen. Kommt
Beispielsweise ein "'" im Dateinamen vor erzeugt das natuerlich eine
ungueltige oder gar "gefaehrliche" SQL-Abfrage.

Gibt es bereits etwas fertiges, durch das ich die Abfragen filtern kann
um solche Probleme zu vermeiden?

Bsp.:

$filename ="hallo'.txt";
$statement = $db->prepare("INSERT INTO TABLE files (filename) values
('$filename')");
$statement->execute;


vielen Dank
Raphael Ernst [ Do, 09 März 2006 17:27 ] [ ID #1222722 ]

Re: Datenbank-Abfrage von illegalen Zeichen befreien

Raphael Ernst schrieb:

> Das Problem sind etwaige Sonderzeichen in den Dateinamen. Kommt
> Beispielsweise ein "'" im Dateinamen vor erzeugt das natuerlich eine
> ungueltige oder gar "gefaehrliche" SQL-Abfrage.
>
> Gibt es bereits etwas fertiges, durch das ich die Abfragen filtern kann
> um solche Probleme zu vermeiden?

Ich nehme an, dass du primär SQL-Injections vermeiden willst. Dazu kannst du
sogenannte "Prepared Queries" verwenden, um dieses Problem zu beheben. Die
Sonderzeichen werden so nicht gefiltert, stören aber das SQL-Query nicht,
was IMHO eigentlich wünschenswerter ist, als dass man gewisse Zeichen nicht
verwenden darf.

Beispiel:

my $query = $dbh->prepare('INSERT INTO BEISPIELTABELLE (NAME,VORNAME) VALUES
(?,?)');
$query->execute($name1,$vorname1);
$query->execute($name2,$vorname2);

Weiteres dazu sollte im Manual stehen.

Gruss

Roman°
--
IRC-Freenode: #usenet-friends
http://albasani.net/cgiirc/irc.cgi
Jetzt abstimmen: <Wahlaufruf1-dana-Nachwahl-1-2006-22.02.2006 [at] dana.de>
Roman Racine [ Do, 09 März 2006 17:42 ] [ ID #1222723 ]

Re: Datenbank-Abfrage von illegalen Zeichen befreien

Raphael Ernst <ernst [at] cs.uni-bonn.de> writes:

> [...] Das Problem sind etwaige Sonderzeichen in den Dateinamen. Kommt
> Beispielsweise ein "'" im Dateinamen vor erzeugt das natuerlich eine
> ungueltige oder gar "gefaehrliche" SQL-Abfrage.
>
> Gibt es bereits etwas fertiges, durch das ich die Abfragen filtern
> kann um solche Probleme zu vermeiden?

Suchst du »s/'/''/g«?

Du kannst diese Probleme auch vermeiden, in dem du Bind-Variablen
benutzt:

$stm = $db->prepare("INSERT INTO TABLE file (name) VALUES (?)");
$stm->execute($filename);

Das ist völlig harmlos, egal was in $filename steht.

> [...]

Peter

--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration
Peter Ehrenberg [ Do, 09 März 2006 17:45 ] [ ID #1222724 ]

Re: Datenbank-Abfrage von illegalen Zeichen befreien

Roman Racine wrote:
> Raphael Ernst schrieb:
>
>> Das Problem sind etwaige Sonderzeichen in den Dateinamen. Kommt
>> Beispielsweise ein "'" im Dateinamen vor erzeugt das natuerlich eine
>> ungueltige oder gar "gefaehrliche" SQL-Abfrage.
>>
>> Gibt es bereits etwas fertiges, durch das ich die Abfragen filtern kann
>> um solche Probleme zu vermeiden?
>
> Ich nehme an, dass du primär SQL-Injections vermeiden willst. Dazu kannst du
> sogenannte "Prepared Queries" verwenden, um dieses Problem zu beheben. Die
> Sonderzeichen werden so nicht gefiltert, stören aber das SQL-Query nicht,
> was IMHO eigentlich wünschenswerter ist, als dass man gewisse Zeichen nicht
> verwenden darf.
>
> Beispiel:
>
> my $query = $dbh->prepare('INSERT INTO BEISPIELTABELLE (NAME,VORNAME) VALUES
> (?,?)');
> $query->execute($name1,$vorname1);
> $query->execute($name2,$vorname2);
>
> Weiteres dazu sollte im Manual stehen.
>
> Gruss
>
> Roman°
Das hab ich gesucht - danke!
Raphael Ernst [ Do, 09 März 2006 18:24 ] [ ID #1222725 ]

Re: Datenbank-Abfrage von illegalen Zeichen befreien

Raphael Ernst wrote:

> Das Problem sind etwaige Sonderzeichen in den Dateinamen. Kommt
> Beispielsweise ein "'" im Dateinamen vor erzeugt das natuerlich eine
> ungueltige oder gar "gefaehrliche" SQL-Abfrage.
>
> Gibt es bereits etwas fertiges, durch das ich die Abfragen filtern kann
> um solche Probleme zu vermeiden?

quote().


> Bsp.:
>
> $filename ="hallo'.txt";

$filename = $db->quote( $filename );

> $statement = $db->prepare("INSERT INTO TABLE files (filename) values
> ('$filename')");
> $statement->execute;



Manni
Manni Heumann [ Fr, 10 März 2006 07:15 ] [ ID #1224294 ]
Perl » de.comp.lang.perl.misc » Datenbank-Abfrage von illegalen Zeichen befreien

Vorheriges Thema: Perl Installation entruempeln
Nächstes Thema: Frage zu fork, SIGCHLD und Timing im Elternprozess