|
 |
|
| Autor |
Nachricht |
800XE Bekannter [Mod]


Anmeldung: 24.10.04 Beiträge: 1294 Wohnort: Speyer
|
Verfasst am: 10.06.2007, 23:41 Titel: SQL md5 Performance |
|
|
abtrennung von
www.webmasterwelt.net/artikel,127,-sicherheitsproblem-mysql--undgt%3B-sql-injection.html
www.webmasterwelt.net/partikel,33698.html#33698
| maject hat folgendes geschrieben: | Zum Schluss möchte ich noch darüber philosophieren ! |
| maject hat folgendes geschrieben: | Deshalb verwende ich seit Jahren, so oft wie es nur geht, die nachfolgende SQL-Abfrage. Die Performance, die merklich nur bei großen Portalen herabfällt nehme ich dabei in Kauf:
| Code: | | where md5(benutzername) = '".md5($_POST['benutzer'])."' and md5(passwort) = '".md5($_POST['passwort'])."' |
|
Also, Performenceteschnich ist das ... tut mir leid .... totaler Mißt
Denn Benutzernamen md5 verdingsen ist ja wohl total unnötig
und wenn man mit md5 oder änlichem arbeitet, sollte man es genau so gespeichert haben und nicht erst im SQLquery .. und auch noch für jede Zeile
| maject hat folgendes geschrieben: |
| Code: |
$query = " select `id` from `benutzer` where
`name`='".$_POST['name']."' and
`passwort`='".$_POST['passwort']."' Limit 0,1";
|
, zum Anderen wird auch nicht (wie viele nicht wissen) auf eine Groß und Kleinschreibung geachtet.
Dies mag beim Benutzernamen vielleicht erwünscht sein, jedoch das Passwort verliert dadurch an Sicherheit. |
Ob oder ob nicht .... liegt auch an der DB selbst ... Zeichensatz Casesensitiv oder nicht
Beim Username finde ich es durchaus wünschenwert wenn er CaseInseSitiv ist ...
... so kann ich mich als "800xe" einlogen und bin dann als "800XE" eigelogt
myCode
| Code: |
$USER='';
$query = " SELECT nick,pass FROM `benutzer`
WHERE nick='".addsleshes($_POST['name'])."'";
$result = mysql_query($query) or die("$query<hr>" . mysql_error());
if( $line = mysql_fetch_array($result, MYSQL_ASSOC))
{
if ( !strcmp( $line['pass'] , $_POST['pass'] )
{
$USER=$line['nick'];
}
}
if ( $USER )
{
$content .= "Hallo $USER";
}
echo ($content);
|
Im SQL nur den Benutzer abfragen ... CaseInSensitiv
Passwort danach via PHP ... CaseSensitiv ... und Benutzernamen(großkleinschreibung) aus der DB übernehmen _________________
Seien wir realistisch, versuchen wir das Unmögliche!
CMS800 :::::::::: Andy 800XE Zmuda :::::::::
ich bin nicht unhöflich, ich bin binär
Zuletzt bearbeitet von 800XE am 12.06.2007, 19:08, insgesamt einmal bearbeitet
|
|
| Nach oben |
|
 |
maject User [User]

Anmeldung: 22.03.06 Beiträge: 13
|
Verfasst am: 11.06.2007, 17:40 Titel: Re: Allgemeine Sicherheit |
|
|
Das kann ich nun nicht so einfach auf mich sitzen lassen :
| 800XE hat folgendes geschrieben: |
Also, Performenceteschnich ist das ... tut mir leid .... totaler Mißt
|
Ich habe beide Varianten mehrmals mal im Vergleichstest mit 10000 Passwortabfragen getestet.
Ja, du hast Recht. Nach der Performance ist dein Script wirklich schneller. Um mal ein paar Zahlen zu nennen (Durchschnittlich): -0,01 bis 0,05 %. Das sind etwa 5^(-5) Sekunden.
Wenn du möchtest kann ich dir auch meine Testbedingungen nochmal geben. Persönlich finde ich diesen Unterschied als sehr marginal. In Großportalen mag dies vielleicht eine Rolle spielen. Aber nicht für kleine Foren oder Boards.
Das mit dem CaseSensitiv / CaseInsensitiv ist wirklich Geschmackssache - jeder wie er möchte - darüber können wir kaum diskutieren, da hat jeder seine eigenen Ansichten.
Außerdem bin ich der Meinung, dass "meine" Passwortabfrage kürzer ist - somit leichter erlernbar.
Vielleicht könnte man das nächste mal alles in einem etwas freundlicheren Ton schreiben. Gruß matze
|
|
| Nach oben |
|
 |
800XE Bekannter [Mod]


Anmeldung: 24.10.04 Beiträge: 1294 Wohnort: Speyer
|
Verfasst am: 12.06.2007, 02:44 Titel: Re: Allgemeine Sicherheit |
|
|
| maject hat folgendes geschrieben: | | Vielleicht könnte man das nächste mal alles in einem etwas freundlicheren Ton schreiben. Gruß matze |
Entschuldigung ....
... ich rede eben nicht durch die Blume
... Fakten Fakten Fakte, wie der Helmut vom Focus immer sagt
| maject hat folgendes geschrieben: | | Wenn du möchtest kann ich dir auch meine Testbedingungen nochmal geben. Persönlich finde ich diesen Unterschied als sehr marginal. In Großportalen mag dies vielleicht eine Rolle spielen. Aber nicht für kleine Foren oder Boards. |
ja, bitte
deinen Test würde ich gerne kennen lernen
| maject hat folgendes geschrieben: | Ich habe beide Varianten mehrmals mal im Vergleichstest mit 10000 Passwortabfragen getestet.
Ja, du hast Recht. Nach der Performance ist dein Script wirklich schneller. Um mal ein paar Zahlen zu nennen (Durchschnittlich): -0,01 bis 0,05 %. Das sind etwa 5^(-5) Sekunden. |
Ich habe auch getestet bzw geBenchmarkt
erstmal eine DB anlegen und 10.000 Datensätze reinpacken
| Code: |
<?php $cmspath=".";
include("cms800/cms800init.php");
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function fecho($file, $echo)
{
$handle=fopen($file,'ab');
fwrite($handle,$echo);
fclose($handle);
}
function make_pass($low,$high)
{
$passkeys ='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$passkeys.='abcdefghijklmnopqrstuvwxyz';
$passkeys.='0123456789';
$passchars=strlen ($passkeys);
$passlen =mt_rand($low,$high);
$i=0;$pass='';
while($i++<$passlen)
{
$pass.=substr($passkeys, mt_rand(0,$passchars-1), 1);
}
return ($pass);
}
$db = mysql_connect ( $_CMS800[mysql1host]
, $_CMS800[mysql1user]
, $_CMS800[mysql1pass] ) or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db( $_CMS800[mysql1base] ) or die("Auswahl der Datenbank fehlgeschlagen" . mysql_error());
$query = "DELETE FROM `md5test`";
$result=mysql_query($query) or die("<b>$query</b>:<br> " . mysql_error());
$test_start=microtime_float();
for( $i=0; $i<10000; $i++ )
{
$nick=make_pass(4,8).$i;
$pass=make_pass(5,20);
$query = "INSERT INTO md5test ";
$query.= "SET nick='$nick'";
$query.= " , pass='$pass'";
$result=mysql_query($query) or die("<b>$query</b>:<br> " . mysql_error());
//while( $line = mysql_fetch_array($result, MYSQL_ASSOC) )
}
$test_end=microtime_float();
echo( $test_end-$test_start . 'sec');
mysql_close($db);
?>
|
Dann wollte ich eigentlich per Zufalsgenerator über die "id" Spalte "Nick" lesen und dann suchen ....
Aber warum suche ich nicht einfach einen Nick den es garnicht gibt ... dadurch habe ich den maximal Wert
= Zeitbedarf im ungünstigsten Falle, das alle Datensätze geprüft werden müßen
| Code: |
$test_start=microtime_float();
$nick='Atari800XE';
$pass='speedTest';
$query = "SELECT * FROM md5test ";
$query.= "WHERE nick='$nick'";
$result=mysql_query($query) or die("<b>$query</b>:<br> " . mysql_error());
$test_end=microtime_float();
echo( $test_end-$test_start . 'sec');
fecho('md5test.txt',"\nsuche $nick ". ($test_end-$test_start) . 'sec');
|
suche Atari800XE 0.02249002456665sec
suche Atari800XE 0.019331932067871sec
suche Atari800XE 0.021368980407715sec
suche Atari800XE 0.023538112640381sec
suche Atari800XE 0.023639917373657sec
suche Atari800XE 0.020564079284668sec
suche Atari800XE 0.023543119430542sec
suche Atari800XE 0.04402494430542sec
suche Atari800XE 0.029356956481934sec
suche Atari800XE 0.022445201873779sec
suche Atari800XE 0.036948919296265sec
suche Atari800XE 0.024893045425415sec
suche Atari800XE 0.032225847244263sec
suche Atari800XE 0.02619194984436sec
=
0.019 - 0.044 sec ... Mittelwert 0.03 Sec
| Code: |
$test_start=microtime_float();
$nick='Atari800XE';
$pass='speedTest';
$query = "SELECT * FROM md5test ";
$query.= "WHERE md5(nick)='".md5($nick)."' AND md5(pass)='".md5($pass)."'";
$result=mysql_query($query) or die("<b>$query</b>:<br> " . mysql_error());
$test_end=microtime_float();
echo( $test_end-$test_start . 'sec');
fecho('md5test.txt',"\nmd5 suche ". ($test_end-$test_start) . 'sec');
|
md5 suche 0.080245018005371sec
md5 suche 0.071171998977661sec
md5 suche 0.094412088394165sec
md5 suche 0.3077290058136sec
md5 suche 0.13628816604614sec
md5 suche 0.084424018859863sec
md5 suche 0.078963041305542sec
md5 suche 0.11139893531799sec
md5 suche 0.0836341381073sec
md5 suche 0.08386492729187sec
md5 suche 0.12213802337646sec
md5 suche 0.12900400161743sec
md5 suche 0.1051778793335sec
md5 suche 0.17788100242615sec
md5 suche 0.078438997268677sec
md5 suche 0.10255718231201sec
md5 suche 0.11529302597046sec
=
0.07 - 0.11 Secunden ... Mittelwert 0.09
(den Ausreisen von 0.30 lassen wir mal weg)
| maject hat folgendes geschrieben: | | (Durchschnittlich): -0,01 bis 0,05 %. Das sind etwa 5^(-5) Sekunden. |
Dein Zeitbedarf gegenüber meinem ist 300%
Secunden interessieren in der Relatin nicht ...
... Andere CPU = anderer Secundenwert, aber gleichbleibender Unterschied in %
Ein Spalte die regelmäßig durchsucht wird, sollte einen "Index" haben ...
... dann muß sie nicht zu 100% durchsucht werden
Index auf "Nick" und auch auf die "Pass" angelegt
md5 Code braucht jetzt
md5 suche 0.051194906234741sec
md5 suche 0.046772003173828sec
md5 suche 0.047326803207397sec
md5 suche 0.07262396812439sec
md5 suche 0.073957204818726sec
md5 suche 0.058257102966309sec
md5 suche 0.11405515670776sec
md5 suche 0.046550035476685sec
md5 suche 0.058548927307129sec
md5 suche 0.13379693031311sec
md5 suche 0.080044984817505sec
=
0.046 - 0.13 .... sagen wir mal 0.07
=
leichte beschleunigung
Bei meinem Code war wohl in einem Lauf ein Anderes CPUhungriges Script am laufen ... deswegen zähle ich den 0.052 nicht
AtariST 0.00051784515380859sec
AtariST 0.000823974609375sec
AtariST 0.0013329982757568sec
AtariST 0.00077414512634277sec
AtariST 0.00092411041259766sec
AtariST 0.00095009803771973sec
AtariST 0.052049160003662sec
AtariST 0.00086808204650879sec
AtariST 0.0007789134979248sec
AtariST 0.00070405006408691sec
AtariST 0.0006711483001709sec
AtariST 0.00049304962158203sec
AtariST 0.00053596496582031sec
=
0.0005 - 0.0013 .... Mittelwert 0.000x
3 Nullen nach dem Komma ... du hast nur eine 0
also bin ich 100x schneller als du
| maject hat folgendes geschrieben: | | (Durchschnittlich): -0,01 bis 0,05 %. Das sind etwa 5^(-5) Sekunden. |
Dein Zeitbedarf gegenüber meinem ist 10.000%
Ich habe es eben noch mit 100.000 Datenzeilen geBencht
bei deinem war meist eine 1 vor dem Komma
ich hatte immer noch 0en nach dem Komma
In dem Speziellen Fall .... Login Prüfen
ist es eigentlich egal obs jetzt 0.00x oder 1.0 Sec dauert
Aber wer an einer Stelle langsamen Code hat, hat ihn vielleicht auch an Anderer Stelle
Vor Wochen ärgerte ich mich, war am verzweifeln
weil eine meiner Sites soooooo langsam war ... 30 .. 60 ... 120 sec
Datenbank mit 1.000.000 Datensätzen
ich überlegte und überlegte .. in meiner Verzweiflung legte ich einfach einige Indexe an ..... schwups war die ladezeit bei 0.5sec
Gruß
Andy 800XE Zmuda _________________
Seien wir realistisch, versuchen wir das Unmögliche!
CMS800 :::::::::: Andy 800XE Zmuda :::::::::
ich bin nicht unhöflich, ich bin binär
|
|
| Nach oben |
|
 |
maject User [User]

Anmeldung: 22.03.06 Beiträge: 13
|
Verfasst am: 12.06.2007, 17:43 Titel: |
|
|
Hallöle,
ich hab mein Script jetzt um ein paar reelleren Bedingungen ergänzt. Demnach ist deine Variante wirklich um einiges schneller. Wie du jedoch auf 100x schneller kommst ist mir fraglich. Der Unterschied (egal ob 1.000 oder 100.000 Datensätze) stets ca. das 2,5 bis 3,5 fache.
Um meine Datenbank zu füllen, nahm ich diese einfach Code-Schnipsel:
| Code: |
for($i=0;$i<1000;$i++) {
mysql_query("insert into `ptest-114` (id,benutzer,passwort) values ('',MD5('".$i."'),MD5(MD5('".$i."')))");
}
|
Und um die Werte zu ermitteln, diesen Code:
| Code: |
$benutzer = md5('1001');
$passwort = md5($benutzer);
for ($i=1;$i<=$e;$i++) {
$z1 = microtime();
$ausgabe = mysql_fetch_assoc(mysql_query("select `benutzer`,`passwort` from `ptest-114` where MD5(benutzer)='".md5($benutzer)."' and MD5(passwort)='".md5($passwort)."' Limit 0,1"));
$z2 = microtime();
$USER = '';
$z3 = microtime();
$query = " SELECT benutzer,passwort FROM `ptest-114` WHERE benutzer='1001'";
$result = mysql_query($query) or die("$query<hr>" . mysql_error());
if( $line = mysql_fetch_array($result, MYSQL_ASSOC)) {
if ( !strcmp( $line['passwort'] , '1001' )) {
$USER=$line['nick'];
}
}
$z4 = microtime();
// Bilde neuen Durchschnitt von Variante 1
list($z1msec,$z1sec)=explode(" ",$z1);
list($z2msec,$z2sec)=explode(" ",$z2);
list($z3msec,$z3sec)=explode(" ",$z3);
list($z4msec,$z4sec)=explode(" ",$z4);
$variante1 = (($variante1*($i-1))+(($z2msec+$z2sec)-($z1msec+$z1sec)))/$i;
$variante2 = (($variante2*($i-1))+(($z4msec+$z4sec)-($z3msec+$z3sec)))/$i;
}
echo 'Variante: m '.$variante1.' | 800XE '.$variante2.'<br />';
echo 'Differenz: '.($variante1-$variante2).'<br />';
$div = (-1 + ($variante1/$variante2))*100;
echo 'Prozentual: '.$div;
|
Wie schon erwähnt, ist alles eine Frage des Geschmacks. Ich denke mal, dass einige vor deinem Code zurückschrecken würden, obwohl es auch nicht viel schwieriger ist. Der unterschied von 1 und 0,x find ich persönlich doch schon ziemlich hoch, aber das ist erst ab 10.000 Datensätzen bei mir der Fall. Bei tausend sind es bei mir 0,1x und 0,0x. Davon mal ganz abgesehen, das Thema ist Sicherheit und nicht Performance.
Meiner Meinung nach, würde ich unsere Beiträge hier auch ausgliedern, bwz. einen Gesamtbeitrag schreiben, da unsere Ergebnisse hier nur die Thematik stören.
Mit Gruß
matze
|
|
| Nach oben |
|
 |
800XE Bekannter [Mod]


Anmeldung: 24.10.04 Beiträge: 1294 Wohnort: Speyer
|
Verfasst am: 12.06.2007, 20:31 Titel: |
|
|
| maject hat folgendes geschrieben: | | for ($i=1;$i<=$e;$i++) { |
Welchen Wert hat e? .... hab jetzt mal 8 genommen
| maject hat folgendes geschrieben: | $e=8;
for ($i=1;$i<=$e;$i++) { |
| maject hat folgendes geschrieben: | deine Variante wirklich um einiges schneller. Wie du jedoch auf 100x schneller kommst ist mir fraglich.
Der Unterschied stets ca. das 2,5 bis 3,5 fache. |
also 250 - 350 unten bei "Prozentual"?
Bei mir schwankt es zwioschen 400 und 1000
mit ausreisern runter 150 rauf 2800 _________________
Seien wir realistisch, versuchen wir das Unmögliche!
CMS800 :::::::::: Andy 800XE Zmuda :::::::::
ich bin nicht unhöflich, ich bin binär
|
|
| Nach oben |
|
 |
maject User [User]

Anmeldung: 22.03.06 Beiträge: 13
|
Verfasst am: 12.06.2007, 23:38 Titel: |
|
|
Ach das hatte ich vergessen, e ist die anzahl der Durchläufe für den Durschnitt... kann man 10 / 100 etc alles einsetzen...
Hängt vielleicht auch damit zusammen, dass ich nur einen Index über den Benutzer habe. Der Index über Passwort müsste ja eigentlich überflüssig sein, zumindest wenn bei der Suche ähnlich dem PHP-IF gefolgt wird (wenn erste bedingung nicht erfüllt, die anderen garnicht erst anschauen...) aber da kenne ich mich nicht wirklich aus.
|
|
| Nach oben |
|
 |
|
|
 |
|
Alle Zeiten sind GMT + 1 Stunde
|
| Seite 1 von 1 |
|  |