Schrift
[thread]3668[/thread]

erste Abfrage dauert lange... (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
renee
 2006-03-29 21:49
#34162 #34162
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist bei ?-Notation so, aber nicht, wenn man einfach ein ' macht...

Also:
Code: (dl )
1
2
3
my $wert = "Hallo, wie geht's??";
my $sth = $dbh->prepare('Select from table where text = '$wert');
$sth->execute();
ist nicht ok

Code: (dl )
1
2
3
my $wert = "Hallo, wie geht's??";
my $sth = $dbh->prepare('Select from table where text = ?);
$sth->execute($wert);
ist ok...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bsnoop
 2006-03-30 02:36
#34163 #34163
User since
2006-03-30
25 Artikel
BenutzerIn
[default_avatar]
Man lernt nie aus.

Aber spricht irgendwas gegen $dbh->quote() ? So habe ich das bisher immer gemacht mit Daten die von außen kamen.

Mal abgesehen davon dass die Verwendung der Platzhalter weniger Tipparbeit ist ;)
ptk
 2006-03-30 02:47
#34164 #34164
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bei der Verwendung von Platzhaltern könnte (theoretisch) die Datenbank einen SQL-Ausdruck einmalig parsen und für weitere Verwendung cachen. Dann müsste die DB nur die Platzhalter ersetzen. Welche real existierende DBs dieses Feature nutzen, weiß ich allerdings nicht.
murphy
 2006-03-30 02:48
#34165 #34165
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn man Statements mehrmals verwenden will, sind Platzhalter eventuell viel effizienter, weil der SQL-Code von der Datenbank nur einmal kompiliert werden muss und wiederholt mit verschiedenen Parametern gefüttert werden kann. Aber ob dieser Vorteil wirklich zum Tragen kommt hängt vom Datenbanktreiber ab.

edit: SQLite 3 kompiliert auf jeden Fall nur einmal, ist also mit Platzhaltern schneller, MySQL glaube ich auch, PostgreSQL glaube ich nicht.\n\n

<!--EDIT|murphy|1143673455-->
When C++ is your hammer, every problem looks like your thumb.
master
 2006-03-30 10:45
#34166 #34166
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@renee
tatsächlich... Du hast recht... habe es überprüft..


Aber ist das "?" totsicher?

schmeisst der alles raus was eine Injection-Gefahr bringt?\n\n

<!--EDIT|master|1143701541-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Dubu
 2006-03-30 11:06
#34167 #34167
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=master,30.03.2006, 08:45]Aber ist das "?" totsicher?
[/quote]
Nur der Tod ist sicher.

Quote
schmeisst der alles raus was eine Injection-Gefahr bringt?

Ja (solange dein SQL-Server keine gravierende Sicherheitslücke hat).
renee
 2006-03-30 12:17
#34168 #34168
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=bsnoop,30.03.2006, 00:36]Man lernt nie aus.

Aber spricht irgendwas gegen $dbh->quote() ? So habe ich das bisher immer gemacht mit Daten die von außen kamen.

Mal abgesehen davon dass die Verwendung der Platzhalter weniger Tipparbeit ist ;)[/quote]
Nein, gegen $dbh->quote() spricht gar nichts. Jedenfalls nichts "Sicherheitsrelevantes".

Als "Gegenargument" könnte man die schon gesagten Sachen nehmen:
* Mehr Schreibarbeit
* Man kann die einmal geparsten Statements nicht nochmal mit neuen Daten verwenden

Mit dem Fragezeichen kann man einmal das prepare machen und dann mit vielen Werten arbeiten:
Code: (dl )
1
2
3
4
5
# nur zum Zeigen ohne Fehlerabfrage
my $sth = $dbh->prepare("INSERT INTO table VALUES(?)");
for(qw(Hallo Welt dies ist ein Test)){
$dbh->execute($_);
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
master
 2006-03-30 12:35
#34169 #34169
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ok hier nun mein SQL-Injection Testskript.

Ich habe das ganze nun für Parameter umgebaut, sodas das
Statement trotzdem lesebar bleibt.

aber so ganz glücklich bin ich mit der lösung noch nicht, besonders aus performence Gründen.

1. gibts ev. einen besseren weg?
(überlege mir gerade statt der Sub einen Hash zunehmen)

2. Auf der Zeile wo die XXX im code sind steht:
Code: (dl )
local $params = shift; @params = @{$params};


das Problem ist, dass ich hier 2 zuviel code brauche... ein Versuch wie das ganze auf @params = @{shift};
zu verkürzen schlug fehl.

Naja bei den SQL abfragen ist hier das shiften eh zu langsam
( aber es geht ums prinzip) also wie erreiche ich sowas:
@params = @{shift}; am schnellsten?



Ganzer Code
Code: (dl )
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
27
28
29
30
31
32
33
34
35
36
@p_sql_tmp=();

&open_sql('SELECT * FROM injection_test WHERE psw='.v($psw).' AND Nummer >'.v($numm), \@p_sql_tmp,$DB_DSN); #Start MSSQL
while ( $result = $sth->fetchrow_hashref() )
{
print $result->{'psw'}." -> ".$result->{'Geheim'}.' -> '.$result->{'Nummer'}."\n";
}
&close_sql; #END MSSQL




#--------------------------- subs ----------------

sub v
{push(@p_sql_tmp,shift);return '?';} &
nbsp; #Paramenter



#-- meine alte subs aber leicht angepasst --
sub open_sql


#SQL öffnen
{
# local $state = shift;
# local $params = shift; @params = @{$params}; #XXX
# local $con_strig = shift;

$dbh = DBI->connect($_[2],'user');
$sth = $dbh->prepare($_[0]);
$sth->execute(@{$_[1]});
}

sub close_sql { $sth->finish(); $dbh->disconnect();} #SQL schliessen....
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-03-30 12:58
#34170 #34170
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich finde die Drchmischung von globalen Variablen, Übergabeparametern und Return-Werten nicht so gut.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $dbh = DBI->connect($db_dsn,'user') or die $DBI::errstr;
my $sth = fire_sql($dbh,$psw,$numm);
while(my $result = $sth->fetchrow_hashref() ){
print $result->{'psw'}." -> ".$result->{'Geheim'}.' -> '.$result->{'Nummer'}."\n";
}

sub fire_sql{
my ($dbh,@params) = @_;
my $stmt = 'SELECT * FROM injection_test WHERE psw=? AND Nummer > ?';
my $loc_sth = $dbh->prepare($stmt) or die $dbh->errstr();
$loc_sth->execute(@params) or die $dbh->errstr();
return $loc_sth;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
master
 2006-03-30 13:17
#34171 #34171
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ja ist nicht so optimal, aber auf die schnelle, fiel mir nix besseres ein: als @p_sql_tmp=();

Versehst du ich will, das SQL statemant leserlich haben, so das ich auf 1 Blick sehe, welche variable wo, welchem feld zugewiesen wird.
---

Am schönsten und schnellsten(wenn nur die doofen zuweisungen nicht wären) wäre für mich sowas:

Code: (dl )
1
2
3
4
$v{'psw'}  = '?';
$v{'numm'} = '?';

"SELECT * FROM injection_test WHERE psw=$v{'psw'} AND Nummer > $v{'numm'}";


Dann kann man das Statement lesen, muss aber vorher alles zuweisen.. :-( und es gibt mehr schreib arbeit... also ist die "sub" doch besser... *nerv*
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2006-03-27 11:02.