kostenloser Webspace werbefrei: lima-city


Zerpflückt mein php Login

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    willstdueswissen

    Kostenloser Webspace von willstdueswissen

    willstdueswissen hat kostenlosen Webspace.

    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 :biggrin:

    Beitrag zuletzt geändert: 7.7.2014 11:28:58 von willstdueswissen

    Abstimmung (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)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo :wave:

    ~700+ Zeilen? Wer soll denn das alles lesen und v.a. überprüfen? :biggrin:

    Vielleicht hier mal fragen? https://codereview.stackexchange.com/

    Session ID in der URL? Warum kein Cookie?

    mfg :wave:
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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)
    $postuname
    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
    $postupw
    ist der selbe Unsinn verbaut.

    3) dein
    preg_match
    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?

    4) empty triff auch auf
    0
    , das sollte zumindest erwähnt sein.

    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)
    ?><?php
    bringt nichts als Unlesbarkeit. Warum nicht einfach immer in PHP bleiben und dann deine Zeile ca. so ausgeben:
    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 »
    $login = true;
    « 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 :-P). 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.
  5. Autor dieses Themas

    willstdueswissen

    Kostenloser Webspace von willstdueswissen

    willstdueswissen hat kostenlosen Webspace.

    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
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    willstdueswissen schrieb:
    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.
    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.
    $_SESSION['logged_in'] = true;


    willstdueswissen schrieb:
    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.
    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 (
    trim()
    hilft da). Und wegen empty selbst: dein Passwort (
    $postupw
    ) wird wohl immer irgend einen Wert ≠ empty haben, weil es das Ergebnis deiner Hash-Funktion ist … auch das solltest du bedenken.
  7. Hey :). Wenn du mir den gesamten Code nochmal gibst kann ich das gern nochmal komplett checken.
    mfg
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!