DBI, Bind Values
am 19.09.2006 10:33:51 von Mario Ospelt
Hallo,
Möchte meine MySQL DB vor Injektionen schützen und verwende dazu bind
values, also die statements prepare, execute und ? als Platzhalter (DBI
Modul). Klappt bis anhin wunderbar. Wie mache ich das aber wenn die
Anzahl an einzufügenden Werten variabel ist? Gibt es da eine Möglichkeit
oder muss ich da mit if und else für jede Möglichkeit ein separates
statement schreiben?
Gruss
Mario
Re: DBI, Bind Values
am 19.09.2006 11:43:15 von Wolf Behrenhoff
Mario Ospelt schrieb:
> Hallo,
>
> Möchte meine MySQL DB vor Injektionen schützen und verwende dazu bind
> values, also die statements prepare, execute und ? als Platzhalter (DBI
> Modul). Klappt bis anhin wunderbar. Wie mache ich das aber wenn die
> Anzahl an einzufügenden Werten variabel ist? Gibt es da eine Möglichkeit
> oder muss ich da mit if und else für jede Möglichkeit ein separates
> statement schreiben?
Was meinst du mit der Anzahl einzufügender Werte genau? Kannst du mal
ein konkretes Beispiel geben?
Wenn du in eine Tabelle mehrere Werte einfügen willst, kannst du einfach
nach einmaligem prepare das execute mehrmals aufrufen.
Wenn du irgendwas anderes, zum Beispiel die where-Bedingung, variabel
lang braucht, dann würde ich $dbh->quote auf die Benutzereingaben
anwenden und $dbh->do nehmen, ohne Platzhalter zu verwenden.
Oder sowas machen wie
push @querys, "WeitereBedingung = ?";
push @bedingungen, $usereingabe;
und dann
prepare('SELECT ... FROM ... WHERE '.join(" AND ",@querys));
execute(@bedingungen);
Du musst in jedem Fall auch auf Spezialfälle achten (wie z.B. gar keine
Bedingung, dann muss das WHERE weg)
Es gibt mehrere Wege, die zum Ziel führen. Nur darf mal das quote nicht
vergessen - daher bevorzuge ich eigentlich auch bei einmaligen Abfragen
die prepare/execute-Kombination mit Platzhaltern - dann kann man es
nicht vergessen. Andere Leute sehen das anders.
Wolf
Re: DBI, Bind Values
am 19.09.2006 12:52:04 von Mario Ospelt
Wolf Behrenhoff schrieb:
> Mario Ospelt schrieb:
>> Hallo,
>>
>> Möchte meine MySQL DB vor Injektionen schützen und verwende dazu bind
>> values, also die statements prepare, execute und ? als Platzhalter (DBI
>> Modul). Klappt bis anhin wunderbar. Wie mache ich das aber wenn die
>> Anzahl an einzufügenden Werten variabel ist? Gibt es da eine Möglichkeit
>> oder muss ich da mit if und else für jede Möglichkeit ein separates
>> statement schreiben?
>
> Was meinst du mit der Anzahl einzufügender Werte genau? Kannst du mal
> ein konkretes Beispiel geben?
>
Sorry, Beispiel sollte natürlich nicht fehlen!
Der SQL Befehl wäre ein INSERT, also:
prepare('INSERT INTO $tabelle VALUES(0,?,?,?,...)');
execute($a,$b,$c,...);
$tabelle ist variabel und kann vier Werte annehmen. Ich möchte diese
beiden Zeilen auf alle vier Tabellen anwenden können. Je nach
angesprochener Tabelle wären es dann aber unterschiedlich viele Werte,
die eingetragen werden müssen. Also eine variable Anzahl an ?. Muss ich
nun für jede der vier Tabellen diese beiden Zeilen separat hinschreiben?
Eine Zusatzfrage: Wie mache ich das am besten, wenn eine gross Zahl an
Werten übergeben werden muss? Wenn es z.B. 100 Werte wären, müsste ich
dann wirklich 100 Fragezeichen verwenden?? Kommt mir etwas umständlich vor!
Re: DBI, Bind Values
am 19.09.2006 13:31:21 von Frank Wiegand
Mario Ospelt schrieb:
> prepare('INSERT INTO $tabelle VALUES(0,?,?,?,...)');
> execute($a,$b,$c,...);
Kannst du nicht richtigen Code posten, anstatt sowas'?
> $tabelle ist variabel und kann vier Werte annehmen. Ich möchte diese
> beiden Zeilen auf alle vier Tabellen anwenden können. Je nach
> angesprochener Tabelle wären es dann aber unterschiedlich viele Werte,
> die eingetragen werden müssen. Also eine variable Anzahl an ?. Muss ich
> nun für jede der vier Tabellen diese beiden Zeilen separat hinschreiben?
my $sth = $dbh->prepare(
sprintf "INSERT INTO %s VALUES (%s)",
$tabelle,
join( ',' => ('?') x @values )
);
$sth->execute(@values);
> Eine Zusatzfrage: Wie mache ich das am besten, wenn eine gross Zahl an
> Werten übergeben werden muss? Wenn es z.B. 100 Werte wären, müsste ich
> dann wirklich 100 Fragezeichen verwenden?? Kommt mir etwas umständlich vor!
Natürlich nicht.
Frank