Zerpflückt mein php Login
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgeben
benutzer
code
datenbank
datum
dingern
element
ergebnis
frage
funktion
http
index
login
machen
nutzer
session
update
url
verarbeiten
zeile
-
Ich habe ein php Login ertstellt, auch schon mit web Vulnerability Scanner überprüft.
Er sagt mir, dass dieser sicher ist, aber so ganz vertraue ich den Dingern nicht und so frage ich die Hacker an euch:
Ist dieser login sicher?
<?php session_start(); $postusersessionid = (!empty($_POST['sid'])? $_POST['sid'] : (!empty($_GET['sid'])? $_GET['sid'] : "" ) ); session_regenerate_id(); $login = false; $postuname = $dbquery->realescapestring($_POST['uname']); //diese Funktion ist das selbe wie mysqli_realescapestring $postupw = $strfn->salthash($dbquery->realescapestring($_POST['upw']),4); //diese Funktion hasht den Wert mit sha256 if($_GET['act'] == "logout") { session_destroy(); $_SESSION = array(); } if(!empty($postuname)&&!empty($postupw)&&!preg_match('/[^a-zA-Z0-9-_.]/', $postuname)&&$_GET['act']=="login"){ $data = $dbquery->query("SELECT * FROM pangeasii_user WHERE name = '" . $postuname . "' AND password='" . $postupw . "'"); if($dbquery->num_rows($data) == 1) { $row = $dbquery->fetchArray($data); $ban = $row[5]; if($ban == 0) { $_SESSION['userid'] = $row[0]; $_SESSION['username'] = $row[1]; $_SESSION['userkey'] = $row[4]; $_SESSION['usersessionid'] = $strfn->salthash(session_id(), 4); $postusersessionid = $_SESSION['usersessionid']; $_SESSION['userip'] = $stdvars->get_client_ip(); // funktion gibt ip aus } } } if($_SESSION['userip'] == $stdvars->get_client_ip()&&$_SESSION['usersessionid'] == $postusersessionid) { $login = true; $_SESSION['usersessionid'] = $strfn->salthash(session_id(), 4); $postusersessionid = $_SESSION['usersessionid']; } if(!empty($_SESSION['userid'])) { $sql = "UPDATE `pangeasii_user` SET `lastaction` = NOW(), `lastactionpageid` = ".$dbquery->realescapestring($_GET['id'])." WHERE `id` = ".$_SESSION['userid']; $dbquery->query($sql); // ist das selbe wie mysqli_query } ?> <?php if(!$login): ?> <a href="javascript:dissc(true, 'background-color: #0000ff', this);dcd(document.getElementById('login'));">Login</a> //macht das div mit der id login sichtbar und erstellt ein div mit 100% und 100%, das sich vor allen anderen Element (bis auf das Login, da z-index auf 1 ist) legt <?php else: ?> <a href="?act=logout">Logout</a> <?php endif; ?> <div id="login" style="visibility: hidden; position: fixed; z-index: 1; padding: 20px; display: block; background-color: #444444; border-radius: 10px;"> <form action="?act=login" method="post"> <input name="uname" type="text"><br /> <input name="upw" type="password"><br /> <input type="submit"> <input type="button" value="Close" onclick="document.getElementById('login').style.visibility = 'hidden';document.getElementById('dissc').remove();"> </form> </div> <a href="?sid=<?=$postusersessionid ?>">Test Link für Session </a>
Hier noch die drei Klassen die dazu gehören
$dbquery->
http://paste42.de/5c719e5e8a51ea2a53760ad8a9dde4f3/7156/dbquery-&linenr
$stdvars->
http://paste42.de/5357604f6ebcbf89a1a814c518adff8c/7154/stdvars-&linenr
$strfn->
http://paste42.de/2c523ace0d38a9f1a5c15099878de192/7151/strfn-&linenr
Danke schon mal
Beitrag zuletzt geändert: 7.7.2014 11:28:58 von willstdueswissenAbstimmung (Nur eine Auswahl möglich)
Ja ist sicher 0 % (0 Stimmen) Nöp, voll unsicher (bitte Begründung und Verbesserung) 0 % (0 Stimmen) Haha wie schlecht. (auch ein Begründung und Verbesserung) 80 % (4 Stimmen) Naja, ganz okay (und hier auch) 20 % (1 Stimme) Bomben sicher, da gibt es nichts dran zu rütteln 0 % (0 Stimmen) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo
~700+ Zeilen? Wer soll denn das alles lesen und v.a. überprüfen?
Vielleicht hier mal fragen? https://codereview.stackexchange.com/
Session ID in der URL? Warum kein Cookie?
mfg -
Hier gibt es gleich mehrere Dinge …
1) wie von voloya erwähnt: warum die Session ID in der URL? Diese Session-ID sieht außerdem nicht sonderlich nützlich aus und wird nur einmal mit einem in der Session gespeicherten Wert verglichen … wozu?
2)
wird sofort via realescapestring escaped, aber anschließend via preg_match geprüft. Beim preg_match kommen also andere Daten an, als du (willstdueswissen) dir dort erwartest. Beim$postuname
ist der selbe Unsinn verbaut.$postupw
3) dein
prüft, ob kein Zeichen vorkommt, und wenn das nicht der Fall ist passt es. Warum so umständlich und nicht einfach prüfen, ob nur gewisse Zeichen vorkommen und dann fortfahren?preg_match
4) empty triff auch auf
, das sollte zumindest erwähnt sein.0
5) bei »logout« holst du dir vorher die POST-Daten … die vermutlich dann nicht gesetzt sind. Außerdem brauchst du dabei schon eine Datenbank-Verbindung für das Escaping.
6) warum »ban« in PHP verarbeiten? Du könntest das schon bei der Abfrage erledigen und dir in PHP diese Verarbeitung sparen (ala »WHERE ban = 0«).
7)
bringt nichts als Unlesbarkeit. Warum nicht einfach immer in PHP bleiben und dann deine Zeile ca. so ausgeben:?><?php
if(!$login) { echo(<<< ETX <a href="javascript:dissc(true, 'background-color: #0000ff', this);dcd(document.getElementById('login'));">Login</a> //macht das div mit der id login sichtbar und erstellt ein div mit 100% und 100%, das sich vor allen anderen Element (bis auf das Login, da z-index auf 1 ist) legt ETX ); } else { echo(<<< ETX <a href="?act=logout">Logout</a> ETX ); }
8) der richtige Spaß kommt zum Schluss: ob man eingeloggt ist oder nicht wird via »
« entschieden und entscheidet nur darüber welcher HTML-Text ausgegeben wird. Das Datenbank-Update wo die Zeit aktualisiert wird wird trotzdem und unabhängig davon durchgeführt, ob der tatsächliche Login erfolgreich war, sobald ich eine IP habe (was ja meistens der Fall sein soll, habe ich gehört ). Und wenn ich nun den »richtigen« HTML-Code am Client »einpflege« bin ich trotzdem eingeloggt? Schlimmer noch: dein Datenbank-Update könnte ein Problem bekommen, wenn die »userid« nicht gesetzt ist weil der tatsächliche Login fehlschlug.$login = true;
-
1) wie von voloya erwähnt: warum die Session ID in der URL? Diese Session-ID sieht außerdem nicht sonderlich nützlich aus und wird nur einmal mit einem in der Session gespeicherten Wert verglichen … wozu?
Wie soll man sonst überprüfen das der Benutzer eingeloggt ist, anstatt das ich ne Session namens Login benutzer (die ich auf true setzte), überprüfe ich ob der Nutzer die gültige session hat
Oder verstehe ich etwas falsch, dann bitte aufklären, sonst lerne ich nichts dazu.
2)3) <- Stimmt ich dämlicher
4) Ich weiß das empty auch 0 als leer sieht. Deswegen weiß ich gerade nicht was du meinst, was in meinem Code falsch ist.
Bitte aufklären.
5) Jup das habe ich nicht beachtet
6) ban verarbeite ich in php, weil ich nachher ne Meldung ausgeben möchte, wie: du wurdest gebannt
7) Das werde ich beherzigen :D
8) Ohhhh .... wieder etwas nicht beachtet :(
Danke schon mal hackyourlife -
willstdueswissen schrieb:
Wenn du die PHP-Funktionen zur Session-Verwaltung verwendest gibt es keinen Grund irgendwelche Session-IDs irgendwo selbst parallel dazu zu verwalten. Und wenn du von einem Benutzer wissen willst ob er eingeloggt ist, dann speicherst du eben einen entsprechenden Wert in der Session. Also z.B.
1) wie von voloya erwähnt: warum die Session ID in der URL? Diese Session-ID sieht außerdem nicht sonderlich nützlich aus und wird nur einmal mit einem in der Session gespeicherten Wert verglichen … wozu?
Wie soll man sonst überprüfen das der Benutzer eingeloggt ist, anstatt das ich ne Session namens Login benutzer (die ich auf true setzte), überprüfe ich ob der Nutzer die gültige session hat
Oder verstehe ich etwas falsch, dann bitte aufklären, sonst lerne ich nichts dazu.$_SESSION['logged_in'] = true;
willstdueswissen schrieb:
Ich weiß nicht ob das so gewollt ist, schließlich gäbe es auch andere Prüfungsmöglichkeiten. Dass jemand einen Benutzernamen mit Leerzeichen registriert solltest du übrigens auch verhindern (
4) Ich weiß das empty auch 0 als leer sieht. Deswegen weiß ich gerade nicht was du meinst, was in meinem Code falsch ist.
Bitte aufklären.
hilft da). Und wegen empty selbst: dein Passwort (trim()
) wird wohl immer irgend einen Wert ≠ empty haben, weil es das Ergebnis deiner Hash-Funktion ist … auch das solltest du bedenken.$postupw
-
Hey :). Wenn du mir den gesamten Code nochmal gibst kann ich das gern nochmal komplett checken.
mfg -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage