2014-12-30T06:37:37 reneeWer sich mal mit SQL-Injections und den Hängen-und-Würgen von PHPs DB-Funktionen in Bezug auf Escaping/Quoting beschäftigt hat, meidet Funktionen, die sich quote() nennen ;) Mir geht's jedenfalls so.(das mit quote() war mir auch neu, aber ich benutze sowieso nur "prepared statements")
2014-12-30T12:11:39 GwenDragonWer sich mal mit SQL-Injections und den Hängen-und-Würgen von PHPs DB-Funktionen in Bezug auf Escaping/Quoting beschäftigt hat, meidet Funktionen, die sich quote() nennen ;) Mir geht's jedenfalls so.
2014-12-30T09:14:12 rostiDBI->quote(): Das ist ja völliger Quatsch, der hat das überhaupt nicht verstanden, denn quote() wird nicht als Klassenmethode verwendet, [...] Nur so nämlich, werden unsichere Strings entsprechend der DB-Engine maskiert,[...]
2014-12-30T09:14:12 rostiJa, und?CGI: Dem sind sind wahrscheinlich die Begriffe 'Schlüsselparameter' und 'Parameter-Kontrollstruktur' absolute Fremdworte.
2014-12-30T09:14:12 rostiWo ist da der Zusammenhang?Von CGI-Programmierung keine Ahnung aber Vorträge halten.
2014-12-30T09:14:12 rostiSelbstherrlicher Vortrag.
DBI->quote(): Das ist ja völliger Quatsch, der hat das überhaupt nicht verstanden, denn quote() wird nicht als Klassenmethode verwendet,
QuoteCGI: Dem sind sind wahrscheinlich die Begriffe 'Schlüsselparameter' und 'Parameter-Kontrollstruktur' absolute Fremdworte. Von CGI-Programmierung keine Ahnung aber Vorträge halten.
QuoteAber wer benutzt DBI->quote()? Wer mal gesehen hats was PHPler murksen, weiß dass quote schlecht funktioniert.
2014-12-30T13:11:39 rostiEs funktioniert einwandfrei, wenn diese Methode nicht als Klassenmethode sondern über die Instanz aufgerufen wird.
1
2
3
4
5
6
7
use DBI;
my $dbh = DBI->connect("DBI:mysql:dbname:host","user","password"); # hier natürlich richtige Werte einsetzen
print $dbh->quote("admin'");
__END__
Ausgabe: 'admin\''
1
2
3
4
5
6
7
use DBI;
my $dbh = DBI->connect("DBI:mysql:dbname:host","user","password"); # hier natürlich richtige Werte einsetzen
print $dbh->quote("admin'",2);
__END__
Ausgabe: admin'
QuotePraxisnah: Ggf. ist ein multiple Insert effizienter als ein prepared Statement. Multiple Insert ist ein Fall für quote().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
use strict; use warnings; use DBI; use feature 'say'; my $dbh = DBI->connect("DBI:mysql:quote_test:localhost","user","test"); my $sql = 'INSERT INTO test (id, name, result) VALUES '; my @tests = ( [ 1, 'quote', 'ok' ], [ 2, 'rose', 'nok' ], [ 3, 'blue', 'ok' ], [ 4, 'hex', 'nok' ], [ 5, 'quote', 'ok' ], ); my (@binds,@tests_sql); for my $test ( @tests ) { push @tests_sql, '(?,?,?)'; push @binds, @{$test}; } $sql .= join ',', @tests_sql; my $sth = $dbh->prepare( $sql ); $sth->execute(@binds);
QuoteUm quote_identifier geht es aber nicht.quote_identifier() maskiert Feldnamen, Tabellennamen, also die Bezeichner und das setze ich immer dann ein, wenn Bezeichner nicht fest im Code verdrahtet sind sondern bspw. von außen her konfigurierbar sind.
QuoteCGI: Wie ein Enctype="application/x-www-form-urlencoded" oder "multipart/form-data" auszusehen hat, steht in uralten RFCs. Wer CGI.pm nicht mag, darf sich gerne einen eigenen Parser schreiben. Für den richtigen Umgang mit Schlüsselparametern und Parameter-Kontrollstrukturen ist das völlig belanglos, solange der Parser RFC-gerecht programmiert ist, was im CGI.pm mit Sicherheit der Fall ist.
print $dbh->quote("admin'",2);
QuoteWas verstehst Du unter Schlüsselparametern und Parameter-Kontrollstrukturen
2014-12-30T17:02:39 rostiCode (perl): (dl )print $dbh->quote("admin'",2);
Das ist mit Sicherheit der falsche Datentyp. SQL_VARCHAR liefert bei mir eine 12 (zwölf). Die Konstanden können auch importiert werden.
2014-12-30T17:02:39 rostiEntweder Du hast Dir den Vortrag nicht angeschaut oder Du hast es nicht verstanden. Es gibt Code, in dem so etwas zu finden ist:Code (perl): (dl )print $dbh->quote("admin'",2);
Das ist mit Sicherheit der falsche Datentyp. SQL_VARCHAR liefert bei mir eine 12 (zwölf). Die Konstanden können auch importiert werden.
my $sql = '.... = ' . $dbh->quote( $cgi->param('user') );
?user=admin'&user=2
QuoteQuoteWas verstehst Du unter Schlüsselparametern und Parameter-Kontrollstrukturen
Hier http://rolfrost.de/progforum.html (letzter Abschnitt) und auf einigen anderen Seiten schreibe ich darüber. Alte Schule ;)
QuoteOk, hat also nix mit dem Thema zu tun...
2014-12-30T11:23:44 GwenDragonFür viele ist Perl == CGI.pm weil es zu Zeiten der DotCom-Blase sehr häufig eingesetzt wurde und viele sich sonst nicht mit Perl beschäftigt habenSo ganz kapiere ich nicht, was das krude Konzept von CGI.pm mit Perl zu tun hat?
2014-12-30T11:23:44 GwenDragonNaja, den Fehler mit Listkontext bei der Hasherzeugung sehe ich relativ regelmäßig.Und der erzählt von Fehlern die ich schon 2004 nicht mehr beim Programmieren machte.
2014-12-30T11:23:44 GwenDragonPHP vermeide ich wo es geht ;-)Aber wer benutzt DBI->quote()? Wer mal gesehen hats was PHPler murksen, weiß dass quote schlecht funktioniert.
2014-12-30T14:01:55 reneeJa, ich habe auch sowas schon öfters in Fremdcode gesehen.2014-12-30T11:23:44 GwenDragonNaja, den Fehler mit Listkontext bei der Hasherzeugung sehe ich relativ regelmäßig.Und der erzählt von Fehlern die ich schon 2004 nicht mehr beim Programmieren machte.
1 2 3
my $foo = $hash->{foo}; # 'b' (the last entry) my $foo = $hash->get('foo'); # 'b' (always, regardless of context) my @foo = $hash->get_all('foo'); # ('a', 'b')
1 2 3
my @names = $req->param; my $value = $req->param('foo'); my ($foo, $bar) = $req->param(['foo', 'bar']);
2014-12-30T18:01:29 reneeIch finde schon, dass es ein Bug in quote ist wenn nicht-Zahlenwerte ungeprüft zurückgegeben werden nur weil es behauptet wird es sei ein Zahlenwert.
$dbh->quote($self->param('name'));
$name = $self->trim( $self->param('name') ); # trim macht ein shift
2014-12-30T19:11:51 rostiAber mal was aus meiner Praxis, bzw, was nicht in meiner Praxis vorkommt:
Code (perl): (dl )$dbh->quote($self->param('name'));
$cgi->param('x') || ''