Datenbank-Abfrage von illegalen Zeichen befreien
Datenbank-Abfrage von illegalen Zeichen befreien
am 09.03.2006 17:27:33 von Raphael Ernst
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
Re: Datenbank-Abfrage von illegalen Zeichen befreien
am 09.03.2006 17:42:43 von Roman Racine
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:
Re: Datenbank-Abfrage von illegalen Zeichen befreien
am 09.03.2006 17:45:23 von Peter Ehrenberg
Raphael Ernst 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
Re: Datenbank-Abfrage von illegalen Zeichen befreien
am 09.03.2006 18:24:14 von Raphael Ernst
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!
Re: Datenbank-Abfrage von illegalen Zeichen befreien
am 10.03.2006 07:15:33 von Manni Heumann
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