|
You last visited: Today at 05:23
Advertisement
Passwort Verschlüsselung bei Regi + Login !?
Discussion on Passwort Verschlüsselung bei Regi + Login !? within the General Coding forum part of the Coders Den category.
09/23/2011, 18:55
|
#16
|
elite*gold: 6
Join Date: Mar 2010
Posts: 416
Received Thanks: 221
|
By the way: So wie ich das gesehn hab beim drüberfliegen:
Vulns:
-XSS
-SQLI
|
|
|
09/23/2011, 18:56
|
#17
|
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
|
Quote:
Originally Posted by Metin2Spieler97
Naja, es erschwert trotzdem das Cracken eines md5-Hashes. ;O
|
naaaaaaaaaaaaaaaja .... trotzdem ists sicherer und sinnvoller den salt extra zu speichern und für jeden hash wieder individuell zu machen...
so hashe ich meine passwörter, bevor ich die in ne db schreib
PHP Code:
$salt = random_str(); $salt2 = random_str(32); $salt3 = random_str(128); $salt4 = random_str(256); $password = htmlspecialchars(md5(md5($_POST['pw'].$salt.md5($salt2.md5($_POST['pw'].$salt3.md5($salt4.$_POST['pw'])))))); write_to_db("user", "pw", $password); write_to_db("user", "salt", $salt); write_to_db("user", "salt2", $salt2); write_to_db("user", "salt3", $salt3); write_to_db("user", "salt4", $salt4);
die hashes knackt mir so schnell niemand mehr
höhö
€dit: final hast natürlich recht, xss sicherheit muss gewehrleistet werden (geht mit htmlspecialchars($zeuch); )
die SQL-Improved extension muss er ned umbedingt verwendenden, mitm standart-müll gehts doch auch... außer er will auf hohe besucherzahlen + schnelle server auslegen, is aber gschmarre ^^
|
|
|
09/23/2011, 19:22
|
#18
|
elite*gold: 6
Join Date: Jul 2009
Posts: 88
Received Thanks: 9
|
Habe in meiner Datenbank unter "filecache" Tabelle "key" gefunden, dort sind viele 32-stellige "hashes" oder wie man das da nennt ^^
PHP Code:
<?php
// Check if he wants to register: if (!empty($_POST[email])) { // Check if passwords match. if ($_POST[password] != $_POST[password2]) exit("Error - Passwörter stimmen nicht überrein. Bitte versuche es noch einmal.");
// Assign some variables. $ip = $_SERVER[REMOTE_ADDR]; $salt = "PASSWORDUNIQUESTRING"; $password = md5($_POST['password'].$SALT);
require_once("connect.php");
// Register him. $query = mysql_query("INSERT INTO user (email, displayName, name, password, bday, salt) VALUES ('$_POST[email]','$_POST[displayName]','$_POST[name]','$password','$bday','PASSWORDUNIQUESTRING')") or die ("Error - Registrieren fehlgeschlagen.");
$query = mysql_query("SELECT * FROM 'user' WHERE email = '$email'"); if (mysql_fetch_row($query)) { echo "Bitte andere Username"; } else echo "Welcome $_POST[username]! You've been successfully reigstered!<br /><br /> Please login <a href='index.php'><b>here</b></a>."; exit(); }
?>
<html> <head> <title>Registrieren</title> </head> <body> <form action="register.php" method="post"> <table width="75%" border="1" align="center" cellpadding="3" cellspacing="1"> <tr> <td width="100%"><h5>Registration</h5></td> </tr> <tr> <td width="100%"><label>Email: <input type="text" name="email" size="25" value="<? echo $_POST[email]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Anzeige-Name: <input type="text" name="displayName" size="25" value="<? echo $_POST[displayName]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Name: <input type="text" name="name" size="25" value="<? echo $_POST[name]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Passwort: <input type="password" name="password" size="16" value="<? $password = md5($_POST['password']); ?>"></label></td> </tr> <tr> <td width="100%"><label>Passwort wiederholen: <input type="password" name="password2" size="16" value=""></label></td> </tr> <tr> <td width="100%"><input type="submit" value="Registrieren!"></td> </tr> </table> </form> </body> </html>
Aus der Datenbank (s.o.)
PHP Code:
vollständige Textfelder key expires size Bearbeiten Löschen 7d17e3a478196a93b8af127c02b4ff9e 1319475867 173 Bearbeiten Löschen db4fdf5d60c33e22288a27d2169eaef5 1319401861 77 Bearbeiten Löschen 1cc4c4e6af16031bd616d29ed11273c5 1317328179 170 Bearbeiten Löschen 83e461dac15743e794d2176dd9e13ff5 1348209752 13 Bearbeiten Löschen d577aa59bef558db0727318f8de260e0 1348209752 13 Bearbeiten Löschen 7e1004285e665bc60c38e8fee728d4cd 1319469389 8 Bearbeiten Löschen 7143677734dfeea5c51aae86f3477cd3 1317295063 149 Bearbeiten Löschen 1079a7f805b610d0eb900ed5de17e4b3 1317331292 128 Bearbeiten Löschen ab411c0f391f353bbfff114ac241cb31 1317331292 3314 Bearbeiten Löschen 08f646df888cd27fc7b89dc5645fdaf1 1317331292 1613 Bearbeiten Löschen 56b6acbddbf3a89b6175721ca7e5eb90 1317331292 1188 Bearbeiten Löschen 684df77efb74d38cdb06af6ced5c0614 1317331292 729 Bearbeiten Löschen b5e312b34c48a5714b335594dfb2e444 1317331292 218 Bearbeiten Löschen 4f7b8b387300ad6588184ac5d1f21ef2 1317331292 139 Bearbeiten Löschen ab8a8e7c6bbc08c4517ffc18b09d4ccb 1317331292 1355 Bearbeiten Löschen 9d327e87fb56fb5f22f90488eab17337 1317331292 1200 Bearbeiten Löschen 18d3a1d05494de6de42b2620081e5163 1317331292 335 Bearbeiten Löschen 7a9623a664e0598ab46d55d8ab82e9fa 1317331292 1697 Bearbeiten Löschen 53af39093cc972c6147c06c0bfae1880 1317331292 1246 Bearbeiten Löschen c82351a0395d19d1a51499e78de9d368 1317331292 654 Bearbeiten Löschen 7f96218cca3d369bcc83e1ff5881a07e 1317331292 3743 Bearbeiten Löschen aff325da4dcdbcf90b6b7d47e8b8782c 1317402313 7 Bearbeiten Löschen 7aadcf96c5eb8e7aff17644821990ee5 1317402309 55 Bearbeiten Löschen d775ed725481ac6691deee5e7bb2f2ad 1317402309 984 Bearbeiten Löschen 79cefee57ad790e145061afae497faec 1317278580 313 Bearbeiten Löschen aad77dbb143cfab111fa9f73e592de54 1317402313 7 Bearbeiten Löschen 90ab9cd79ea27ad5af5d75cb58ea2302 1317331426 130 Bearbeiten Löschen c716010f9c052249df573d74fcaa31ca 1317331426 4055 Bearbeiten Löschen 890c91f06790f2fb22bad773e16aabc5 1317331426 2189 Bearbeiten Löschen 8488ec2c7bace28d2ff7c383c42ba6bd 1317331426 1320
Edit:
Funktionier immernoch nicht
|
|
|
09/23/2011, 22:38
|
#19
|
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
|
Quote:
Originally Posted by nicileie
Habe in meiner Datenbank unter "filecache" Tabelle "key" gefunden, dort sind viele 32-stellige "hashes" oder wie man das da nennt ^^
PHP Code:
<?php
// Check if he wants to register: if (!empty($_POST[email])) { // Check if passwords match. if ($_POST[password] != $_POST[password2]) exit("Error - Passwörter stimmen nicht überrein. Bitte versuche es noch einmal.");
// Assign some variables. $ip = $_SERVER[REMOTE_ADDR]; $salt = "PASSWORDUNIQUESTRING"; $password = md5($_POST['password'].$SALT);
require_once("connect.php");
// Register him. $query = mysql_query("INSERT INTO user (email, displayName, name, password, bday, salt) VALUES ('$_POST[email]','$_POST[displayName]','$_POST[name]','$password','$bday','PASSWORDUNIQUESTRING')") or die ("Error - Registrieren fehlgeschlagen.");
$query = mysql_query("SELECT * FROM 'user' WHERE email = '$email'"); if (mysql_fetch_row($query)) { echo "Bitte andere Username"; } else echo "Welcome $_POST[username]! You've been successfully reigstered!<br /><br /> Please login <a href='index.php'><b>here</b></a>."; exit(); }
?>
<html> <head> <title>Registrieren</title> </head> <body> <form action="register.php" method="post"> <table width="75%" border="1" align="center" cellpadding="3" cellspacing="1"> <tr> <td width="100%"><h5>Registration</h5></td> </tr> <tr> <td width="100%"><label>Email: <input type="text" name="email" size="25" value="<? echo $_POST[email]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Anzeige-Name: <input type="text" name="displayName" size="25" value="<? echo $_POST[displayName]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Name: <input type="text" name="name" size="25" value="<? echo $_POST[name]; ?>"></label></td> </tr> <tr> <td width="100%"><label>Passwort: <input type="password" name="password" size="16" value="<? $password = md5($_POST['password']); ?>"></label></td> </tr> <tr> <td width="100%"><label>Passwort wiederholen: <input type="password" name="password2" size="16" value=""></label></td> </tr> <tr> <td width="100%"><input type="submit" value="Registrieren!"></td> </tr> </table> </form> </body> </html>
Aus der Datenbank (s.o.)
PHP Code:
vollständige Textfelder key expires size Bearbeiten Löschen 7d17e3a478196a93b8af127c02b4ff9e 1319475867 173 Bearbeiten Löschen db4fdf5d60c33e22288a27d2169eaef5 1319401861 77 Bearbeiten Löschen 1cc4c4e6af16031bd616d29ed11273c5 1317328179 170 Bearbeiten Löschen 83e461dac15743e794d2176dd9e13ff5 1348209752 13 Bearbeiten Löschen d577aa59bef558db0727318f8de260e0 1348209752 13 Bearbeiten Löschen 7e1004285e665bc60c38e8fee728d4cd 1319469389 8 Bearbeiten Löschen 7143677734dfeea5c51aae86f3477cd3 1317295063 149 Bearbeiten Löschen 1079a7f805b610d0eb900ed5de17e4b3 1317331292 128 Bearbeiten Löschen ab411c0f391f353bbfff114ac241cb31 1317331292 3314 Bearbeiten Löschen 08f646df888cd27fc7b89dc5645fdaf1 1317331292 1613 Bearbeiten Löschen 56b6acbddbf3a89b6175721ca7e5eb90 1317331292 1188 Bearbeiten Löschen 684df77efb74d38cdb06af6ced5c0614 1317331292 729 Bearbeiten Löschen b5e312b34c48a5714b335594dfb2e444 1317331292 218 Bearbeiten Löschen 4f7b8b387300ad6588184ac5d1f21ef2 1317331292 139 Bearbeiten Löschen ab8a8e7c6bbc08c4517ffc18b09d4ccb 1317331292 1355 Bearbeiten Löschen 9d327e87fb56fb5f22f90488eab17337 1317331292 1200 Bearbeiten Löschen 18d3a1d05494de6de42b2620081e5163 1317331292 335 Bearbeiten Löschen 7a9623a664e0598ab46d55d8ab82e9fa 1317331292 1697 Bearbeiten Löschen 53af39093cc972c6147c06c0bfae1880 1317331292 1246 Bearbeiten Löschen c82351a0395d19d1a51499e78de9d368 1317331292 654 Bearbeiten Löschen 7f96218cca3d369bcc83e1ff5881a07e 1317331292 3743 Bearbeiten Löschen aff325da4dcdbcf90b6b7d47e8b8782c 1317402313 7 Bearbeiten Löschen 7aadcf96c5eb8e7aff17644821990ee5 1317402309 55 Bearbeiten Löschen d775ed725481ac6691deee5e7bb2f2ad 1317402309 984 Bearbeiten Löschen 79cefee57ad790e145061afae497faec 1317278580 313 Bearbeiten Löschen aad77dbb143cfab111fa9f73e592de54 1317402313 7 Bearbeiten Löschen 90ab9cd79ea27ad5af5d75cb58ea2302 1317331426 130 Bearbeiten Löschen c716010f9c052249df573d74fcaa31ca 1317331426 4055 Bearbeiten Löschen 890c91f06790f2fb22bad773e16aabc5 1317331426 2189 Bearbeiten Löschen 8488ec2c7bace28d2ff7c383c42ba6bd 1317331426 1320
Edit:
Funktionier immernoch nicht
|
Kp was das für Keys sind...
Musst auf jeden in deiner Tabelle n neues Feld anfügen sonst wirds nüscht
|
|
|
09/23/2011, 22:40
|
#20
|
elite*gold: 6
Join Date: Mar 2010
Posts: 416
Received Thanks: 221
|
@〤Che〤
Verstehst du nicht genau was SQLI ist?
Ich kann über das POST-Array welches nicht via mysql_real_escape_string geprüft wird eigenen SQL-Code injecten. Sehr gefährliche Lücke!!!
|
|
|
09/24/2011, 15:11
|
#21
|
elite*gold: 0
Join Date: Oct 2008
Posts: 319
Received Thanks: 88
|
Quote:
Originally Posted by finaldown97
@〤Che〤
Verstehst du nicht genau was SQLI ist?
Ich kann über das POST-Array welches nicht via mysql_real_escape_string geprüft wird eigenen SQL-Code injecten. Sehr gefährliche Lücke!!!
|
Wobei mysql_real_escape auch nicht 100% sicher ist. Am besten ist es
eine Whitelist anzulegen und den String über einen Regulären Ausdrück prüfen
zu lassen.
Einen eigenen Salt für jeden Benutzer neu zu generieren ist zwar keine
schlechte Idee aber vollkommen unnötig. Verwendest du einen salt wie
"fsUdnfna8273jd&"mf" Also einfach ein String aus zufälligen Zeichen reicht
das vollkommen aus, da md5 bisher unknackbar ist, und bei einem solchem
Salt Rainbotables vollkommen nutzlos sind.
|
|
|
09/24/2011, 18:54
|
#22
|
elite*gold: 6
Join Date: Jul 2009
Posts: 88
Received Thanks: 9
|
Schön wenn ihr das geklärt habt, aber leider weicht ihr vom Thema ab, will nurnoch hinkriegen, dass das mit dem Registrieren klappt *bettel*
|
|
|
09/25/2011, 18:34
|
#23
|
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
|
Zu dem SQLI... jo hab ich falsch verstanden, dachte du meinst die SQLi-Extension, weil sie schneller ist...
Quote:
Originally Posted by Fratyr
Wobei mysql_real_escape auch nicht 100% sicher ist. Am besten ist es
eine Whitelist anzulegen und den String über einen Regulären Ausdrück prüfen
zu lassen.
Einen eigenen Salt für jeden Benutzer neu zu generieren ist zwar keine
schlechte Idee aber vollkommen unnötig. Verwendest du einen salt wie
"fsUdnfna8273jd&"mf" Also einfach ein String aus zufälligen Zeichen reicht
das vollkommen aus, da md5 bisher unknackbar ist, und bei einem solchem
Salt Rainbotables vollkommen nutzlos sind.
|
Zu deiner Behauptung, dass man md5-Hahses nicht knacken kann:

 
Funktionieren soweit ich weiß alle mit gigantischen Rainbowtables
Und wer es gerne lokal will:

 
(Laufen alle übern GPU, weil der bis zu 20 mal schneller als der CPU ist...)
Also behaupte nicht, dass man md5-Hashes nicht Cracken kann... Wenn er gesalzen ist, dann machste halt 2 Crackvorgänge...
Also per Bruteforce + gigantischen Rainbowtables ist es möglich sowas zu Cracken... Die Liste dient jetzt nicht zu irgendwelchen kriminellen Aktionen, sondern nur zur Demonstration, dass es sehrwohl möglich ist und nix besonderes ist... (Liste per Google in 5 Minuten zusammengestellt... es gab mal noch ne Seite die besser war aber die find ich grad ned)
Das was du über mysql_real_escape sagst, ist vollkommen richtig... Man sollte bei Projekten, bei denen man auf die Sicherheit achtet alles verbieten, bis auf das, was man selbst machen will/muss!
@nici: Sieh dir meine letzten Posts an, wenn du sie verstanden hast, kannst du dir daraus innerhalb von n paar minuten n voll funktionsfähiges Registrations/Login-Script basteln...
|
|
|
09/25/2011, 20:04
|
#24
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
|
Quote:
Originally Posted by Fratyr
Wobei mysql_real_escape auch nicht 100% sicher ist. Am besten ist es
eine Whitelist anzulegen und den String über einen Regulären Ausdrück prüfen
zu lassen.
Einen eigenen Salt für jeden Benutzer neu zu generieren ist zwar keine
schlechte Idee aber vollkommen unnötig. Verwendest du einen salt wie
"fsUdnfna8273jd&"mf" Also einfach ein String aus zufälligen Zeichen reicht
das vollkommen aus, da md5 bisher unknackbar ist, und bei einem solchem
Salt Rainbotables vollkommen nutzlos sind.
|
Wenn man einen eigenen Salt für jedes Passwort generiert, dann sind Rainbow-Tables nutzlos. Wenn man allerdings den selben Salt für jedes Passwort benutzt, dann kann man sich einfach neue Rainbow-Tables mit dem Salt generieren.
Aus dem Grund sollte man auch nicht überall den selben Salt verwenden, ganz egal wie lang er ist.
|
|
|
09/25/2011, 21:11
|
#25
|
elite*gold: 6
Join Date: Mar 2010
Posts: 416
Received Thanks: 221
|
Btw: mysql_real_escape_string ist eigentlich recht sicher, nicht wie Fratyr meint.
Jedoch ist darauf zu achten bei SqlQuerys wie "SELECT * FROM döner WHERE id = 1337" bzw. "SELECT * FROM döner WHERE id = ".$integer das man um den Integer ' und ' macht denn sonst $integer = "1 AND INJECTION_CODE_EINFÜGEN"; et voila "SELECT * FROM döner WHERE id = 1 AND INJECTION_CODE_EINFÜGEN" aber mit mysql_real_escape_string
in Verbindung mit ' und ' ("SELECT * FROM döner WHERE id = '".mysql_real_escape_string($integer)."'"; ist man dann auch geschützt. Denn um Sql Code zu injecten muss man wieder ein ' sezten aber das wird durch die Tolle Funktion die ich jetzt 100 mal erwähnt hab ge-escapdded.
Fazit: Sicherheit hat viel mit dem Programmierer und seinen Kenntnissen zu tun.
PS:  das nutzt mehrere Rainbowtables
|
|
|
09/25/2011, 22:38
|
#26
|
elite*gold: 0
Join Date: Oct 2008
Posts: 319
Received Thanks: 88
|
Ein Salt aus zufälligen Zeichen, der allerdings Konstant ist und sich
nicht wie bei Metin2Spieler bei jedem User ändert ist 100%ig sicher. Ich weiß nicht aber
falls es euch noch nicht aufgefallen ist kann der PHP Code nicht vom Clienten eingesehen
werden, ein Salt der einzigartig aus zufälligen Zeichen besteht ist dadurch unknackbar.
Quote:
|
Also behaupte nicht, dass man md5-Hashes nicht Cracken kann... Wenn er gesalzen ist, dann machste halt 2 Crackvorgänge...
|
Du kannst nichts Brutforcen wenn der Salt unbekannt ist, und das ist er in 99% der
Fälle da der Hacker keinen Zugriff auf die Konfigurationsdatei hat die den Salt enthält.
Hat der Hacker aber Zugriff so hat man das gleiche Sicherheitsrisiko wie wenn man
den Salt für jeden User einzeln generiert, wer sich Serverzugriff verschaffen kann,
hat auch Datenbankzugriff, alleine schon durch die SQL Konfigurationen in deinen PHP
Skripten.
Quote:
|
Btw: mysql_real_escape_string ist eigentlich recht sicher, nicht wie Fratyr meint.
|
Es geht hier um 100%ige Sicherheit und nicht um "recht sicher". Und tut mir Leid,
ich will dich wirklich nicht angreifen aber aus deinem Namen resultiere ich das du
97 geboren bist? Ich habe sicherlich einige Jahre mehr an Programmiererfahrung
auf dem Buckel, und weiß sehr wohl wie mysql_real_escape_string funktioniert.
Das mysql_real_escape_string komplett unsicher ist habe ich nebenbei nie behauptet!
Quote:
|
Fazit: Sicherheit hat viel mit dem Programmierer und seinen Kenntnissen zu tun.
|
Wiegesagt, klemm dich erst nocheinmal ein paar Jahre hinter eine Programmiersprache,
bevor du so einen Kommentar ablässt.
Quote:
|
Wenn man einen eigenen Salt für jedes Passwort generiert, dann sind Rainbow-Tables nutzlos. Wenn man allerdings den selben Salt für jedes Passwort benutzt, dann kann man sich einfach neue Rainbow-Tables mit dem Salt generieren.
|
Wie schon gesagt wie willst du dir eine Rainbotable anlegen wenn der Salt doch
unbekannt ist? Sollange du nicht "hallo" als Salt verwendest, bleibe ich bei meiner
Meinung, und das ist Fakt das Rainbowtables nutzlos sind. Erforderlich dafür ist nur
ein einzigartiger Salt.
Quote:
|
Aus dem Grund sollte man auch nicht überall den selben Salt verwenden, ganz egal wie lang er ist.
|
Siehe oben, diese Aussage ist komplett falsch.
Um es nocheinmal zusammenzufassen da ich vielleicht etwas um den heißen Brei
geredet habe:
Ein Salt aus sinnlos zusammengesetzten Zeichen, Zahlen und Buchstaben mit einer
gewissen Länge ist genauso schwer zu knacken wie ein Salt der für jeden User
eigen generiert wird. Und um das nocheinmal klar zustellen, es ist keine schlechte
Idee, und auch kein Fehler, ich halte es nur ganz einfach für unnötig!
Edit:
Quote:
|
Also behaupte nicht, dass man md5-Hashes nicht Cracken kann
|
Der md5 Algorythmus ist bisher ungeknackt.
|
|
|
09/26/2011, 22:43
|
#27
|
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
|
Quote:
Originally Posted by Fratyr
Es geht hier um 100%ige Sicherheit und nicht um "recht sicher". Und tut mir Leid,
ich will dich wirklich nicht angreifen aber aus deinem Namen resultiere ich das du
97 geboren bist?
|
Bitte... BITTE schließe NIEMALS vom Alter einer Person auf deren Fähigkeiten!
Quote:
Originally Posted by Fratyr
Der md5 Algorythmus ist bisher ungeknackt.
|
Hab ich nie behauptet, ist auch totaler Quatsch, weil man den Algorythmus nie umkehren werden kann (Hash = Unumkehrbare Verschlüsselung)...
MD5 - Wikipedia, the free encyclopedia <-- siehe hier
AAAABER:
Wir weichen hier vollkommen vom Thema ab o.O
Die Ursprungsfrage war, wie man einen Login + Regi baut, welche funktioniert...
Da mir hier auch langsam die schwachsinnigen Diskusionen aufn Sack gehn gibts jetzt mal hier die Loginfunktion, die ich in meinem Forenscript (welches ich grad schreibe und im XML-Forenscript) verwende:
einloggen.php
PHP Code:
<?php /* Loginscript Made by xChex */ require_once("./func.php"); session_start(); //Per Formular übergebene Daten abfragen $name = $_POST['name']; //Benutzername $pw = $_POST['pw']; //Passwort $name = preg_replace("#\s{2,}#", " ", $name);// Doppelte Leerzeichen im namen löschen $pw = preg_replace("#\s{2,}#", " ", $pw);// Selbes mit dem Passwort $_SESSION['name'] = $name; //Benutzername zur weiterverwendung in der Session speichern $action = $_POST['action']; //Aktion abrufen
if ($action == "ausloggen"){ //Überprüfen ob ausgeloggt werden soll $_SESSION['log'] = "ausgeloggt"; //In der Session auf Ausloggen stellen header("Location: ".$config['main']['index']); //Zurücklinken } elseif ($action == "einloggen"){ //Wenn eingeloggt werden soll $db = new DB; if ($db->anzeigen_where("user", "id", "usn", $name) != 0){ //uid richtig //passwortüberprüfung -> start! //salt abfragen $salt = $db->anzeigen_where("user", "salt", "usn", $name); if ($salt != ""){ //passwort generieren $passwort = md5(md5($salt).md5($pw)); //passwort abfragen //passwörter abgleichen if ($db->anzeigen_where("user", "pw", "usn", $name) == $passwort){ $_SESSION['log'] = "eingeloggt"; //Den Status "eingeloggt" in die Session speichern $_SESSION['fail'] = ""; header("Location: ".$config['main']['index']); //Zurücklinken } else{ $_SESSION['fail'] = "true"; header("Location: ".$config['main']['index']); //Zurücklinken } } else{ $_SESSION['fail'] = "true"; header("Location: ".$config['main']['index']); //Zurücklinken } } else{ $_SESSION['fail'] = "true"; header("Location: ".$config['main']['index']); //Zurücklinken } } elseif ($action == "register"){ $salt = salt(); $daten = array("usn" => $_POST['name'], "pw" => md5(md5($salt).md5($_POST['pw'])), "salt" => $salt); $db = new DB; if ($db->anzeigen_where("user", "id", "usn", $name) == 0){ $db->schreiben_multi("user", $daten); $_SESSION['log'] = "eingeloggt"; header("Location: ".$config['main']['index']); //Zurücklinken } else { echo "User existiert schon"; $form = new form; $form->back_button(); } } else{ //In allen anderen Fällen header("Location: ".$config['main']['index']); //Zurücklinken } ?>
wichtiges aus der func.php
PHP Code:
<?php $config['db']['db'] = 'datenbank'; $config['db']['prefix'] = 'prefix_';
$config['db']['host'] = 'localhost'; $config['db']['usn'] = 'user'; $config['db']['pw'] = 'passwort'; $config['main']['index'] = 'index.php';
class DB{ function __construct() { $this->verbinden(); } private function verbinden(){ global $db, $config; $db = mysql_connect($config['db']['host'], $config['db']['usn'], $config['db']['pw']); if (!$db){ echo "Verbindung zur Datenbank gescheitert!<br>"; } else{ $this->select(); } } private function select(){ global $db, $config; mysql_select_db($config['db']['db'], $db); } private function trennen(){ global $db; if (isset($db)){ mysql_close($db); } } // Operationen public function schreiben_multi($table, $array){ global $config; $abfrage = "INSERT INTO `".mysql_real_escape_string(htmlspecialchars($config['db']['prefix'].$table))."` (".mysql_real_escape_string(htmlspecialchars(arrparser::array2fields($array))).") VALUES (".mysql_real_escape_string(htmlspecialchars(arrparser::array2values($array))).")"; $query = mysql_query($abfrage); if (!$query){ echo "fail<br>"; } } public function anzeigen_where($table, $field, $kriterium_field, $kriterium_value){ $abfrage = "SELECT `".mysql_real_escape_string(htmlspecialchars($field))."` FROM `".mysql_real_escape_string(htmlspecialchars($config['db']['prefix'].$table))."` WHERE `".mysql_real_escape_string(htmlspecialchars($kriterium_field))."` = '".mysql_real_escape_string(htmlspecialchars($kriterium_value))."'"; $query = mysql_query($abfrage); $row = mysql_fetch_row($query); return $row[0]; } function __destruct() { $this->trennen(); echo "getrennt"; } } class arrparser{ public static function array2fields($array){ $var = 0; $fields_array = array_keys($array); while ($var < count($fields_array)){ if ($var == 0){ $fields = "`".$fields_array[$var]."`"; } else{ $fields .= ", `".$fields_array[$var]."`"; } ++$var; } return $fields; } public static function array2values($array){ $values_array = array_values($array); $var = 0; while ($var < count($array)){ if ($var == 0){ $values = "'".$values_array[$var]."'"; } else{ $values .= ", '".$values_array[$var]."'"; } ++$var; } return $values; } class form{ public function login(){ global $config; //einloggformular if ($_SESSION['fail'] == "true"){ //Wenn Einlogg-Versuch fehl geschlagen ist echo "<h4>Login fehlgeschlagen. Bitte nochmals probieren!</h4>"; } else{ //Ansonsten echo "<h4>Bitte loggen Sie sich ein</h4>"; } echo "<form action=\"einloggen.php\" method=\"POST\">"; echo "<input type=\"hidden\" name=\"action\" value=\"einloggen\" />"; //Einlogg-Aktion auswählen echo "<table class=\"main_table\" align=\"center\">"; echo "<tr><td width=\"150\">Foren-Username:</td>"; echo "<td colspan=\"2\" width=\"300\"><input type=\"text\" name=\"name\" size=\"40\" maxlength=\"50\"/></td>"; //Benutzername echo "</tr><tr>"; echo "<td width=\"150\">Foren-Password:</td>"; echo "<td colspan=\"2\" width=\"300\"><input type=\"password\" name=\"pw\" size=\"40\" /></td>"; //Passwort echo "</tr><tr>"; echo "</table>"; echo "<input type=\"submit\" value=\"Einloggen\" />"; //Einloggen echo "</form>"; echo "<form action=\"".$config['main']['index']."\" method=\"POST\">"; echo "<input type=\"hidden\" name=\"action\" value=\"registrieren\" />"; echo "<input type=\"submit\" value=\"Registrieren\" />"; echo "</form>"; } public function register(){ echo "<form action=\"einloggen.php\" method=\"POST\">"; echo "<input type=\"hidden\" name=\"action\" value=\"register\" />"; //Registrations-Aktion auswählen echo "<table class=\"main_table\" align=\"center\">"; echo "<tr><td width=\"150\">Foren-Username:</td>"; echo "<td colspan=\"2\" width=\"300\"><input type=\"text\" name=\"name\" size=\"40\" maxlength=\"50\"/></td>"; //Benutzername echo "</tr><tr>"; echo "<td width=\"150\">Foren-Password:</td>"; echo "<td colspan=\"2\" width=\"300\"><input type=\"password\" name=\"pw\" size=\"40\" /></td>"; //Passwort echo "</tr><tr>"; echo "</table>"; echo "<input type=\"submit\" value=\"Registrieren\" />"; //Registrieren echo "</form>"; } public function logswitch(){ session_start(); if ($_SESSION['log'] == "eingeloggt"){ $this->logout(); } else{ $this->formular(); } } public function logout(){ //Auslogg-Button echo "<form action=\"einloggen.php\" method=\"POST\">"; echo "<input type=\"hidden\" name=\"action\" value=\"ausloggen\" />"; //Auslogg-Aktion auswählen echo "<td colspan=\"2\" align=\"left\"><input type=\"submit\" name=\"upload\" value=\"Ausloggen\" class=\"button\" /></td>"; //Ausloggen echo "</form>"; } public function back_button(){ // Zurück-Button echo "<form action=\"\" method=\"post\">"; echo "<input type=\"hidden\" name=\"action\" value=\"back\">"; echo "<p><input type=\"submit\" value=\"Zurück\"></p>"; echo "</form>"; } }
function salt($length="8") { $set = array("a","A","b","B","c","C","d","D","e","E","f","F","g","G","h","H","i","I","j","J","k","K","l","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","S","t","T","u","U","v","V","w","W","x","X","y","Y","z","Z","1","2","3","4","5","6","7","8","9"); $str = '';
for($i = 1; $i <= $length; ++$i) { $str .= $set[mt_rand(0, count($set)-1)]; }
return $str; }
function clean(){ ob_end_clean(); ob_start(); } ?>
index.php:
PHP Code:
<?php require_once "./func.php"; //funktionsdatei includieren session_start(); ob_start(); if (isset($_SESSION['log'])){ if ($_SESSION['log'] == "eingeloggt"){ //tue was getan werden soll, wenn eingeloggt ist } else{ $form = new form; $form->login(); if (isset($_POST['action'])){ if ($_POST['action'] == "registrieren"){ clean(); $form->register(); } } } } else{ $form = new form; $form->login(); if (isset($_POST['action'])){ if ($_POST['action'] == "registrieren"){ clean(); $form->register(); } } } ?>
Bitte nicht über die überflüssigen Klassen etc wundern, sind nur die wichtigsten Funktionen aus den teilweise gigantischen Klassen rauskopiert und aufs wesentliche gekürtzt....
Außerdem verwende ich im Orginalscript noch eine 4. Datei Namens config.php in der ich das Array $config definiere... die Datei wird nur in die func.php includiert... 
nuja viel Spaß damit, Source mag teilweise komisch Kommentiert sein, hab die Kommentare nur schnell reingehaun (und teilweise sind noch alte drin, die garnichtmehr stimmen  )
€dit: kannst selber anpassen, alles kau ich auch ned vor... Devnotes hab ich mal rausgenommen, da das Script getestet ist, brauchste die nimmer
|
|
|
09/26/2011, 23:53
|
#28
|
elite*gold: 0
Join Date: Oct 2008
Posts: 319
Received Thanks: 88
|
Quote:
Originally Posted by 〤Che〤
Bitte... BITTE schließe NIEMALS vom Alter einer Person auf deren Fähigkeiten!
Hab ich nie behauptet, ist auch totaler Quatsch, weil man den Algorythmus nie umkehren werden kann (Hash = Unumkehrbare Verschlüsselung)...
MD5 - Wikipedia, the free encyclopedia <-- siehe hier
|
Doch doch, das kommt aufs Alter an, da man mit 14 (1997) noch garnicht in
der Lage ist genug Programmiererfahrung mitzubringen, esseiden er hat im
Alter von 7 damit angefangen, was ich doch stark bezweifle.
Nich böse gemeint, aber ihr macht es mir wirklich einfach klug zu scheißen 
der SHA1 Algorythmus wurde geknackt, md4 glaube ich auch.
Noch was zu deinem Code, Deutsch und Englisch gemischt ist ein No-Go
beim Programmieren, entscheide dich für eines der beiden!
PHP Code:
... // Operationen public function schreiben_multi($table, $array){ global $config; $abfrage = "INSERT INTO `".mysql_real_escape_string(htmlspecialchars($config['db']['prefix'].$table))."` (".mysql_real_escape_string(htmlspecialchars(arrparser::array2fields($array))).") VALUES (".mysql_real_escape_string(htmlspecialchars(arrparser::array2values($array))).")"; $query = mysql_query($abfrage); if (!$query){ echo "fail<br>"; } } ...
srsly? Das kann doch nich dein Ernst sein oder? Du scheinst den Sinn der
OOP nicht ganz verstanden zu haben, sonst würdest du deine Klassen nicht
voller HTML packen. Wieso sind deine "arrparser" statisch? Weils cool
aussieht?
Ihr (oder du) habt/hast das grundlegende Prinzip, und wie man Klassen
wirklich verwendet noch nicht wirklich verstanden, in dem Fall von deinem
Code wäre es sogar fast noch klüger prozeduralen Code zu verwenden,
da deine Klassen noch nicht wirklich einen Sinn machen, noch einem Zweck
dienen, aber das wird schon mit der Zeit, ich frag mich nur manchmal wieso
mich Leute verbessern oder über PHP/JS "aufklären" wollen, wenn sie doch
offensichtlich die Sprache (noch) nicht beherrschen? Ist nicht böse gemeint,
aber nurmal Fakt, Übung macht nicht nur den Meister, sondern auch
(Praxis)Erfahrung, und die habt ihr offensichtlich alle noch nicht!
|
|
|
09/27/2011, 13:30
|
#29
|
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
|
Quote:
Originally Posted by Fratyr
Doch doch, das kommt aufs Alter an, da man mit 14 (1997) noch garnicht in
der Lage ist genug Programmiererfahrung mitzubringen, esseiden er hat im
Alter von 7 damit angefangen, was ich doch stark bezweifle.
Nich böse gemeint, aber ihr macht es mir wirklich einfach klug zu scheißen 
der SHA1 Algorythmus wurde geknackt, md4 glaube ich auch.
Noch was zu deinem Code, Deutsch und Englisch gemischt ist ein No-Go
beim Programmieren, entscheide dich für eines der beiden!
PHP Code:
... // Operationen public function schreiben_multi($table, $array){ global $config; $abfrage = "INSERT INTO `".mysql_real_escape_string(htmlspecialchars($config['db']['prefix'].$table))."` (".mysql_real_escape_string(htmlspecialchars(arrparser::array2fields($array))).") VALUES (".mysql_real_escape_string(htmlspecialchars(arrparser::array2values($array))).")"; $query = mysql_query($abfrage); if (!$query){ echo "fail<br>"; } } ...
srsly? Das kann doch nich dein Ernst sein oder? Du scheinst den Sinn der
OOP nicht ganz verstanden zu haben, sonst würdest du deine Klassen nicht
voller HTML packen. Wieso sind deine "arrparser" statisch? Weils cool
aussieht?
Ihr (oder du) habt/hast das grundlegende Prinzip, und wie man Klassen
wirklich verwendet noch nicht wirklich verstanden, in dem Fall von deinem
Code wäre es sogar fast noch klüger prozeduralen Code zu verwenden,
da deine Klassen noch nicht wirklich einen Sinn machen, noch einem Zweck
dienen, aber das wird schon mit der Zeit, ich frag mich nur manchmal wieso
mich Leute verbessern oder über PHP/JS "aufklären" wollen, wenn sie doch
offensichtlich die Sprache (noch) nicht beherrschen? Ist nicht böse gemeint,
aber nurmal Fakt, Übung macht nicht nur den Meister, sondern auch
(Praxis)Erfahrung, und die habt ihr offensichtlich alle noch nicht!
|
Jo also mit dem Mischen von Deutsch und Englisch haste vollkommen recht, da hab ich als ich das geschrieben hab noch nicht so drauf geachtet...
Als ich das kleine Script geschrieben hab, hab ich grade erst mit PHP angefangen (ist ca n Monat her  )... Da wusst ich einiges noch nicht...
Natürlich kann man mit Templates arbeiten, dann wirds übersichtlicher... Natürlich kann ich meinen HTML-Code außerhalb des PHP-Codes schreiben
PHP Code:
<?php $test = 1; if ($test == 1){ ?> <form> <input type="text" value="ich bin eine textbox"> </form> <?php } else { ?> <form> <input type="password" value="mich kann man nicht lesen"> </form> <?php } ?>
ist mir klar, aber damals wusste ich sowas noch nicht...
Und warum meine Array-Funktionen statisch sind? Naja weil dann der Aufruf kürzer ist...
nicht statisch:
PHP Code:
$arrparser = new arrparser; $arrparser->array2values($array);
statisch:
PHP Code:
arrparser::array2values($array);
oder spricht irgendwas gegen meine faulheit?
Zu dem Hashing-Zeug: Kann ich nit viel dazu sagen, kenn mich jetzt da nicht sooooo toll aus, ich bin jedoch der ansicht, dass man Hashes nicht umkehren kann... Verschlüsselung =/= Hash
Nebenbei: Anstatt hier nur andere zu kritisieren, könntest du ja auch mal zeigen, wie du es machen würdest....
|
|
|
09/27/2011, 14:30
|
#30
|
elite*gold: 6
Join Date: Mar 2010
Posts: 416
Received Thanks: 221
|
Wo wir schon dabei sind, ich habe recherchiert, mysql_real_escape_string ist garnicht so unsicher wie du behauptest. Ich denke bevor du hier so ein "Müll" verbreitest solltest du erstmal prüfen ob du recht hast. Sollte ich mich irren und du hast Recht und sogar 'nen Beweis dafür, dann entschuldige ich mich.
|
|
|
 |
|
Similar Threads
|
Regi Hash Verschlüsselung HELP!!
05/22/2010 - Metin2 Private Server - 5 Replies
Close Pls hat sich erledigt =)
|
Metin2 Verschlüsselung für Regi Page??
05/21/2010 - Metin2 Private Server - 5 Replies
Hey da ich ja in meinem anderen thread meine BETA Phase meiner Registrations Page gestartet habe brauche ich noch die verschlüsselung die Metin2 für die Authenfizierung des servers benutzt weil finden tuhe ich sie nirgendswo SHA1, MD5, Base64 und mysql_escape_string habe ich schon alles versucht aber keines davon erstellt den Hash Code "*00A51F3F48415C7D4E8908980D443C29C69B60C9&qu ot; beim erstellen auf meiner Regi Page mit dem Passwort 12345 würde mich freuen wenn ihr mir helfen könntet
MFG...
|
PFlyff-Server Passwort-Verschlüsselung. Welcher Art?
02/12/2010 - Flyff Private Server - 4 Replies
Hallo alle miteinander.
Erstmal großes Lob an Euer Forum, ohne es hätte ich bestimt nie meinen eigenen PServer gemacht ;).
Zum Problem das mich quält:
Ich arbeite grade an einem Webinterface zur Charerstellung/Registrierung/Verwaltung, also wo man auch Items dem Char ins Inventory packen kann, ohne immer alles mühsam in die DB einzutragen oder auch die Monsterdrops bearbeiten kann ohne Zusatzprogramme usw...
Nun habe ich das Problem, das Flyff ja einen Verschlüsselungsmechanismus...
|
All times are GMT +1. The time now is 05:25.
|
|