€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 ^^
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.");
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.");
@〤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!!!
@〤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.
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...
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.
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
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
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 } ?>
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
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!
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....
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.
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...