Php Script sicher machen...

freakcx

Erfahrenes Mitglied
Hallo,

Ich wollte jetzt mal anfangen meine komplette Seite sicherer zu machen. Ein Bekannter, der Informatik studiert hat meine Seite wohl mit einem Linux-Scanner geprüft und mir gesagt das mein Login-Script eine große Sicherheitslücke aufweißt ... da Er momentan überhaupt keine Zeit hat wegen Klausuren ect. dachte ich poste ich mal mein Login (welcher bereits deaktiviert ist) Und bitte die Cracks unter euch mir mal Hilfestellung zu geben.

PHP:
function login($refresh)
{

  if(isset ($_POST['c_nick']) AND ($_POST['c_pw']))
  {
  $query = mysql_query("SELECT * FROM profile WHERE nick = '".$_POST['c_nick']."'");
  $ask = mysql_fetch_array($query);

    if($ask['nick'] == $_POST['c_nick'])
    {
    		 if($ask['pass'] == $_POST['c_pw'])
    		 {
    			  setcookie("login_user",$_POST['c_nick'],time()+1800,"/");
    			  echo '<div class="size1">Sie werden eingelogt!...</div><meta http-equiv="refresh" content="1; URL=index.php?content='.$refresh.'">';
    		 }
         else
         {
           echo '<div class="size1">Passwort falsch!</div>';
         }
    }
    else
    {
      echo '<div class="size1">Benutzername falsch!</div>'; 
    }
  }
}

Danke vorweg Chris
 
Mein Vorschlag:
PHP:
function login( $login, $pass )
{

	$query = '
		SELECT
		        1
		  FROM
		        `profile`
		  WHERE
		        `nick` = "'.mysql_real_escape_string($login).'"
		    AND `pass` = "'.mysql_real_escape_string($pass).'"
		';
	$result = mysql_query($query);
	if( mysql_num_rows($result) === 1 ) {
		return setcookie('login_user', $login, time()+1800, '/');
	}

	return false;

}


if( isset($_POST['c_nick']) && isset($_POST['c_pw']) ) {
	if( login($_POST['c_nick'], $_POST['c_pw']) ) {
		echo 'Sie sind nun eingeloggt.';
	} else {
		echo 'Benutzername und/oder Passwort sind falsch.';
	}
} else {
	echo 'Bitte geben Sie Benutzernamen und Passwort ein.';
}
 
Hallo Chris,

  • Zeile 4 müsste wohl so lauten:
PHP:
if(isset ($_POST['c_nick']) AND isset($_POST['c_pw']))
  • Zeile 6:
    Grundregel: Von außerhalb kommende Daten (vor allem aber Benutzereingaben) sind grundsätzlich böse! Das heißt, man muss darauf vorbereitet sein, dass diese Daten alles enthalten, nur nur nicht das, was man erwartet. Deshalb niemals Einträge aus $_POST, $_GET etc. ungefiltert in eine Datenbankabfrage einbinden. Wenn es sich um einen String handelt, sollte man vorher [phpf]mysql_real_escape_string[/phpf] drüberlaufen lassen, bei Ganzzahlen hilft beispielsweise [phpf]intval[/phpf].
    So sollte die Zeile dann aussehen:
PHP:
  $query = mysql_query("SELECT * FROM profile WHERE nick = '".mysql_real_escape_string($_POST['c_nick'])."'");
In deinem Fall geht zwar keine größere Gefahr von der fehlenden Filterung aus (soweit ich das sehen kann), aber man sollte es sich trotzdem angewöhnen.
  • Zeile 11:
    Passwörter sollte man schon allein aus Datenschutzgründen nicht im Klartext in der Datenbank speichern. Meist wird hier stattdessen ein Hashwert wie beispielsweise MD5 verwendet.
  • Zeile 13:
    Authentifizierst du den Benutzer wirklich nur über dieses Cookie? Damit steht es jedem frei, das Cookie auf seinem Rechner zu verändern und sich damit ohne Passwortabfrage als jeder beliebige User auszugeben. Da müsstest du dir was anderes überlegen (z.B. Sessions).
  • Zeile 18:
    Es empfiehlt sich eigentlich nicht, gesondert auf ein falsches Passwort hinzuweisen. Dadurch wird es jemanden, der nach gültigen Zugangsdaten sucht, nämlich leichter gemacht (er kann erst mal nach einen gültigen Benutzernamen suchen und dann nach dem passenden Passwort).

So, das war's erst mal. Hab jetzt nicht alles ganz detailliert beschrieben, darum einfach nachfragen, wo weiter Informationsbedarf besteht.

Grüße,
Matthias
 
Jo Thx, hatte eben auch ein Tuti gefunden...

Noch eine Sache zu md5... Das bringt nicht wirklich viel da das PW von Host aus unverschlüsselt gesendet wird... Wie du schon selbst sagtest da gehts wohl mehr um Datenschutz.
 
Hallo,

du kannst bei Bedarf auch clientseitig vor dem Versenden den MD5-Hash bilden und dann diesen abschicken (z.B. mit JavaScript). Oder du setzt gleich auf HTTPS.

Grüße,
Matthias
 
Hm, ok soweit habe ich jetzt nicht gedacht :) aber was anders... Gumbo hat wie ich finde ein sehr gutes Script gepostet was ich teilweise übernehmen werde danke an dieser stelle an Gumbo ebenso dank dir Matthias! Noch was zu Cookies wie könnte ich die denn sicherer machen so das der User keinen wirklichen Erfolg mit ändern des Cookies erziehlen würde?
 
Zurück