Folgendes Loginscript sicher?

eternitysoft

Mitglied
Hab bloß mal eine kleine Frage und zwar folgende ich hab mir ein Loginscript gemacht
und wollte wissen ob das so sicher ist
login.php
PHP:
  <?php session_start (); ?> 
  <html>
  <head>
  <link rel="stylesheet" type="text/css" href="../style.css">
  </head>
  <body>
  <?
  include('../config.php');
  	  if($action=="login")
  	   {
  		$connect = mysql_connect($dbhost, $dbuser, $dbpass);
  		  if(!$connect)		
  		   {
  			die('Verbindung nicht möglich : ' . mysql_error());
  		   } //connect
  		   else
  		   {//connect else
  			$select = mysql_select_db($dbname);
  			  if(!select)
  				 {
 		 	die('konnte datenbank nicht auswählen: ' . mysql_error());
  			   }//select
  			  else
  			   { //else select
  				$name = $_POST['logname'];
  				$pass = $_POST['logpass'];
  				$pass = md5($pass);
 		 	$check = "SELECT * FROM news_et_users WHERE admin LIKE '".$name."' AND pw = '".$pass."'";
 				$result = mysql_query ($check); 
 				$result2 = mysql_num_rows($result);
  				 if ($result2 > 0)
  				  {
 				 $data = mysql_fetch_array ($result); 
 				 $_SESSION["user_id"] = $data["id"];
 				 $_SESSION["user_nickname"] = $data["admin"];
 				 header ("Location: admin.php"); 
  				  }//result if
  				  else
  				  {//else result 
  				   $action="";
  				  }//ende else result if
 			 }//ende else select		  
  		   }//connect else ende		   
  		}// action 
  		else
  		{ //action else
 		 echo '<table width="200" cellspacing="0" cellpadding="0" border="0" align="center">';
  		 echo '<form name="login" action="login.php" method="post"><br>';
 		 echo '<tr><td width="50%" align="right">Name:</td><td width="50%" align="left"><input type="text" name="logname" id="feld" value=""></td></tr>';
 		 echo '<tr><td width="50%" align="right">Passwort:</td><td width="50%" align="left"> <input type="password" name="logpass" id="feld" value=""></td></tr>';
 		 echo '<tr><td width="50%" align="right"></td><td width="50%"><input type="submit" value="login" class="Button3" style="width: 80px;"></td></tr>';
  		 echo '<input type="hidden" name="action" value="login">';
  		 echo '</form>';
  		 echo '</table>';
  		} //action else ende
  ?>
  </body>
  </html>
und jede datei die geschützt sein soll:

PHP:
  <?php session_start (); ?> 
  <html>
  <head>
  <link rel="stylesheet" type="text/css" href="../style.css">
  </head>
  <body>
  <?
  include('../config.php');
  
  	if (!isset ($_SESSION["user_id"]))
  	 {
  	  header ("Location: login.php");
  	 }
  	 else
  	 {
  	 /* code */
  	 }
  ?>
  </body>
  </html>
ausloggen
PHP:
 <?
 ob_start ();
 
 session_start ();
 session_unset ();
 session_destroy ();
 
 header ("Location: login.php");
 ob_end_flush (); 
 ?>
 
und wollte wissen ob das so sicher ist
Ist es nicht, weil du die Variablen im SQL-Statement nicht escapest ([phpf]mysql_escape_string[/phpf]).
Bei deiner jetzigen Variante würde es ausrechen als Passwort folgene Zeichenkette zu übergeben und schon wäre man eingeloggt:
Code:
' or '1' = '1

Sven
 
sprich im müsste es so umändern oder?

PHP:
<?php session_start (); ?> 
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="../style.css">
 </head>
 <body>
 <?
 include('../config.php');
 function quote_smart($value)
 {
    // stripslashes, falls nötig
    if (get_magic_quotes_gpc()) {
 	   $value = stripslashes($value);
    }
 
    // quotieren, falls kein integer
    if (!is_int($value)) {
 	   $value = "'" . mysql_real_escape_string($value) . "'";
    }
 
    return $value;
 }
 	  if($action=="login")
 	   {
 		$connect = mysql_connect($dbhost, $dbuser, $dbpass);
 		  if(!$connect)		
 		   {
 			die('Verbindung nicht möglich : ' . mysql_error());
 		   } //connect
 		   else
 		   {//connect else
 			$select = mysql_select_db($dbname);
 			  if(!select)
 				 {
 		    	die('konnte datenbank nicht auswählen: ' . mysql_error());
 			   }//select
 			  else
 			   { //else select
 				$name = $_POST['logname'];
 				$pass = $_POST['logpass'];
 				$pass = md5($pass);
 		    	$check = sprintf("SELECT * FROM news_et_users WHERE admin=%s AND pw=%s",
 					quote_smart($_POST['logname']),
 				    quote_smart($_POST['logpass']));
 				$result = mysql_query ($check); 
 				$result2 = mysql_num_rows($result);
 				 if ($result2 > 0)
 				  {
 				   $data = mysql_fetch_array ($result); 
 				   $_SESSION["user_id"] = $data["id"];
 				   $_SESSION["user_nickname"] = $data["admin"];
 				   header ("Location: admin.php"); 
 				  }//result if
 				  else
 				  {//else result 
 				   $action="";
 				  }//ende else result if
 			   }//ende else select	    	   
 		   }//connect else ende		   
 		}// action 
 		else
 		{ //action else
 		 echo '<table width="200" cellspacing="0" cellpadding="0" border="0" align="center">';
 		 echo '<form name="login" action="login2.php" method="post"><br>';
 		 echo '<tr><td  width="50%" align="right">Name:</td><td  width="50%" align="left"><input type="text" name="logname" id="feld" value=""></td></tr>';
 		 echo '<tr><td  width="50%" align="right">Passwort:</td><td  width="50%" align="left"> <input type="password" name="logpass" id="feld" value=""></td></tr>';
 		 echo '<tr><td  width="50%" align="right"></td><td  width="50%"><input type="submit" value="login" class="Button3" style="width: 80px;"></td></tr>';
 		 echo '<input type="hidden" name="action" value="login">';
 		 echo '</form>';
 		 echo '</table>';
 		} //action else ende
 ?>
 </body>
 </html>
 
Zuletzt bearbeitet:
eternitysoft hat gesagt.:
aber es geht nicht kann mir da mal jemand helfen?
Das ist eine recht schwammige Fehlerbeschreibung. Debuggen hilft! Wenn etwas nicht geht, dann prüfe, ob Fehlermeldungen erscheinen. Wenn ja, dann geben diese Aufschluss über fehlerhafte Zeilen. Wenn keine Fehlermeldungen erscheinen, stimmt etwas nicht an der Logik deines Codes. In diesem Falle musst du prüfen, welche Stellen des Codes durchlaufen werden. Werden falsche Stellen durchlaufen, prüfst du, welche Variablen und Verzweigungen dafür verantwortlich sind. Lass dir die Inhalte der Variablen ausgeben und taste dich so zur Ursache des Fehlers vor. Mit der Aussage "geht nicht", machst du uns nur das Leben schwer, weil man sich jede deiner 74 geposteten Zeilen anschauen muss. Würdest du sagen, dass eine Fehlermeldung xyz erscheint, oder was genau nicht funktioniert, wären wir schon ein großes Stück weiter.

Mein erster Tipp: Verwende
PHP:
if($_POST['action']=="login")
statt
PHP:
if($action=="login")

Stichwort: register_globals.

Sven
 
Ich weiß ehrlich gesagt jetzt nicht, warum du $value escape'st!?

Das problematische ist doch dein Select!

Und da nimmst du zwei $_POST rein -> logname, logpass

logpass jagst du in md5() rein, also musst du das nicht unbedingt escapen (' OR '1' = '1 hat nämlich nen anderen Hash-Wert als ein echtes Passwort :-) )

Was du aber escapen musst, das ist der logname!

shutdown
 
also es kam jetzt imemr der weg als wenn die eingaben falsch wäre (also falscher login) obwohl die varis den richtigen wert hatten hab das jetzt mal so umgeändert:

PHP:
  <?php session_start (); ?> 
  <html>
  <head>
  <link rel="stylesheet" type="text/css" href="../style.css">
  </head>
  <body>
  <?
  include('config.php');
  function quote_smart($value)
  {
     // stripslashes, falls nötig
     if (get_magic_quotes_gpc()) {
  	   $value = stripslashes($value);
     }
  
     // quotieren, falls kein integer
     if (!is_int($value)) {
  	   $value = "'" . mysql_real_escape_string($value) . "'";
     }
  
     return $value;
  }
  	  if($_POST['action']=="login")
  	   {
  		$connect = mysql_connect($dbhost, $dbuser, $dbpass);
  		  if(!$connect)		
  		   {
  			die('Verbindung nicht möglich : ' . mysql_error());
  		   } //connect
  		   else
  		   {//connect else
  			$select = mysql_select_db($dbname);
  			  if(!select)
  				 {
 		 	die('konnte datenbank nicht auswählen: ' . mysql_error());
  			   }//select
  			  else
  			   { //else select
  				$pass = $_POST['logpass'];
  				$pass = md5($pass);
 		 	$check = sprintf("SELECT * FROM news_et_users WHERE admin=%s AND pw=%s",
 					quote_smart($_POST['logname']));
  
 				$result = mysql_query ($check); 
 				$result2 = mysql_num_rows($result);
  				 if ($result2 > 0)
  				  {
 				 $data = mysql_fetch_array ($result); 
 				 $_SESSION["user_id"] = $data["id"];
 				 $_SESSION["user_nickname"] = $data["admin"];
 				 header ("Location: admin.php"); 
  				  }//result if
  				  else
  				  {//else result 
  				   $action="";
  				  }//ende else result if
 			 }//ende else select		  
  		   }//connect else ende		   
  		echo $_POST['logname'];
  		echo $_POST['logpass'];
  		}// action 
  		else
  		{ //action else
 		 echo '<table width="200" cellspacing="0" cellpadding="0" border="0" align="center">';
  		 echo '<form name="login" action="login2.php" method="post"><br>';
 		 echo '<tr><td width="50%" align="right">Name:</td><td width="50%" align="left"><input type="text" name="logname" id="feld" value=""></td></tr>';
 		 echo '<tr><td width="50%" align="right">Passwort:</td><td width="50%" align="left"> <input type="password" name="logpass" id="feld" value=""></td></tr>';
 		 echo '<tr><td width="50%" align="right"></td><td width="50%"><input type="submit" value="login" class="Button3" style="width: 80px;"></td></tr>';
  		 echo '<input type="hidden" name="action" value="login">';
  		 echo '</form>';
  		 echo '</table>';
  		} //action else ende
  ?>
  </body>
  </html>
sprich das mit dem pw rausgelassen (siehe shutdown's post)
aber jetzt kommt folgende fehlermeldung:

Warning: sprintf() [function.sprintf]: Too few arguments in ... on line 42

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ... on line 45

hier nochmal die endsprechnenden zeilen
41-42
PHP:
  	$check = sprintf("SELECT * FROM news_et_users WHERE admin=%s AND pw=%s",
 					quote_smart($_POST['logname']));

44-46
PHP:
   $result = mysql_query ($check); 
 				$result2 = mysql_num_rows($result);
  				 if ($result2 > 0)
 
Zurück