[PHP] Loginscript sichern

djjlx

---???---
ID: 62937
L
9 Mai 2006
599
21
Hallo zusammen!

Ich hätte mal ne Frage zu Sicherheitslücken in PHP Anwendungen:

Ich hab ein Login Script gemacht und bin mir nicht sicher ob es geschützt ist vor Angriffen.

1 Seite nur html Formular das per POST versendet wird

Dann kommt die Abfrage hier der CODE:

PHP:
<?php  
// Datenbankverbindung aufbauen  
$connectionid = mysql_connect ("xxx", "xxx", "xxx");  
if (!mysql_select_db ("xxx", $connectionid))  
{  
  die ("Keine Verbindung zur Datenbank");  
}  
$sql = "SELECT ".    
     "id, nick ".    
       "FROM ".    
     "xxx_user ".    
       "WHERE ".    
     "id = '".$_POST['id']."' AND ".    
       "passwort = '".md5($_POST['passwort'])."'";
$result = mysql_query($sql)or die(mysql_error());  

if (mysql_num_rows ($result) > 0)   
 {  
	// Benutzerdaten in ein Array auslesen.  
	$data = mysql_fetch_array ($result);  
	
	// Sessionvariablen erstellen und registrieren  
	session_start();
	$_SESSION["id"] = $data["id"];  
	$_SESSION["nick"] = $data["nick"];  

	echo "<script language='javascript'>
	     window.location.href='memberarea/check_login.php';
		 </script>";
 }  

else  
{  
echo "<script language='javascript'>
window.location.href='login.php?fehler=1';
</script>";  
session_destroy();
}  
?>

Ich hab auch nach Injections gegooglet und ausprobiert ob ich die Abfrage umgehen kann.
Soweit ich erkennen konnte (aus den Suchergebnissen) ist ein DB Prefix (ABC_user,ABC_banner) auch besser als nur den db namen (user,banner).

Wie sicher ist nun mein Code?
 
PHP:
<?php  
// Datenbankverbindung aufbauen  
$connectionid = mysql_connect ("xxx", "xxx", "xxx");  
if (!mysql_select_db ("xxx", $connectionid))  
{  
  die ("Keine Verbindung zur Datenbank");  
}  
?>
Warum so umständlich?
tuts...
PHP:
<?PHP
$db=mysql_connect("localhost","root","") or die ("Keine Verbindung zur Datenbank");
?>
nicht auch ;)?
 
Hallo!

Ich hab nun die Code hinzugefügt:

Nach der DB Verbindnung:
PHP:
    function db_query($query){
    $args=func_get_args();
    $vargs=array();
    for($i=1;$i<func_num_args();$i++) {
      if(get_magic_quotes_gpc()) {
        $args[$i]=stripslashes($args[$i]);
      }
      $vargs[]=mysql_real_escape_string($args[$i]);
    }
    $query=vsprintf($query,$vargs);
    $res=mysql_query($query);
    return($res);
  }
  db_query("SELECT id, nick FROM xxx_user WHERE id = '".$_POST['id']."' AND passwort = '".md5($_POST['passwort'])."'"); 

$result = mysql_query(db_query)or die(mysql_error());

Nur macht mir das db_query Probleme da hab ich irgenwo einen Fehler eingebaut den ich nicht finde :(

LG
 
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'db_query' at line 1
 
$result = mysql_query(db_query)or die(mysql_error()); <- is mir grad irgendwie nich richtig ein Begriff.. db_query is doch nirgendwo als constante gesetzt.. x_X
 
Siehe erstes Post Code Zeile 17

(Damit ich den Code nicht nochmal einfügen muss);-)

Da wird dann $result aufgerufen
 
Ja dein Code stimmt trotzdem nicht.

So hier:

PHP:
    function db_query($query){
    $args=func_get_args();
    $vargs=array();
    for($i=1;$i<func_num_args();$i++) {
      if(get_magic_quotes_gpc()) {
        $args[$i]=stripslashes($args[$i]);
      }
      $vargs[]=mysql_real_escape_string($args[$i]);
    }
    $query=vsprintf($query,$vargs);
    $res=mysql_query($query);
    return($res);
  }
$query = db_query("SELECT id, nick FROM xxx_user WHERE id = '".$_POST['id']."' AND passwort = '".md5($_POST['passwort'])."'"); 
 
$result = mysql_query($query)or die(mysql_error());

Änderungen: Zeile 14 und 16.
 
Änderungen: Zeile 14 und 16.
Das stimmt immer noch nicht. db_query() führt die Query genauso aus wie mysql_query() (weil mysql_query() ja in db_query() aufgerufen wird, und daher auch die Rückgabe kommt) und deswegen müsstest du eigentlich schreiben
PHP:
$result = db_query("SELECT id, nick FROM xxx_user WHERE id = '".$_POST['id']."' AND passwort = '".md5($_POST['passwort'])."')
 
Siehe erstes Post Code Zeile 17
(Damit ich den Code nicht nochmal einfügen muss);-)
Da wird dann $result aufgerufen

Entweder ich bin heut zu doof, oder du drückst dich zu unverständlich aus.. :/

Also.. im 1. post in zeile 7 liest du ja auch ne Variable ins query ein.. in dem anderem code aber, liest du einfach nur das wort "db_query" ein, ins mysql_query.. und das kann nich gehn.. soweit ich weiß .. :shifty:
 
Was macht ihr alle für einen Scheiß ? :ugly:

db_query formatiert mit Hilfe von sprintf. D.h. es muss die entsprechende Syntax eingehalten werden, sonst klappt das nämlich nie ;)
PHP:
$res = db_query("SELECT id, nick FROM xxx_user WHERE id=%u AND passwort='%s'", $_POST['id'], md5($_POST['passwort']));
P.S. "or die" is böse.
 
Das stimmt immer noch nicht. db_query() führt die Query genauso aus wie mysql_query() (weil mysql_query() ja in db_query() aufgerufen wird, und daher auch die Rückgabe kommt) und deswegen müsstest du eigentlich schreiben
PHP:
$result = db_query("SELECT id, nick FROM xxx_user WHERE id = '".$_POST['id']."' AND passwort = '".md5($_POST['passwort'])."')

Das kommt davon wenn man versucht so nebenbei neben der Arbeit zu helfen. :ugly: Sollte mich in Zukunft besser konzentrieren. Sorry. :-?
 
Was macht ihr alle für einen Scheiß ? :ugly:

db_query formatiert mit Hilfe von sprintf. D.h. es muss die entsprechende Syntax eingehalten werden, sonst klappt das nämlich nie ;)
PHP:
$res = db_query("SELECT id, nick FROM xxx_user WHERE id=%u AND passwort='%s'", $_POST['id'], md5($_POST['passwort']));
P.S. "or die" is böse.

Ja so Funktionierts! Danke wieder mal an TheHacker

und selbstverständlich auch allen anderen! :)
 
@djjlx:
Vielleicht gewöhnst du dir bei dieser Funktion gleich an, dass Integers immer Integers und Strings immer Strings sind.

D.h.
PHP:
$res = db_query("UPDATE table SET foo=%u", $foo);
$res = db_query("UPDATE table SET bar='%s'", $bar);
ist korrekt, hingegen
PHP:
$res = db_query("UPDATE table SET foo='%u'", $foo);
$res = db_query("UPDATE table SET bar=%s", $bar);
ist immer falsch !
 
manch einer weis ja noch nicht mal was ein String was ein Integer ist...
Derjenige muss dann eben googlen :p

String = Zeichenkette, z.B. "Hallo.", "4%3$(§(fhh" oder "¯Øæ½9DTîŠưŀďrk´¶¹Ï¨K©"
Integer = Ganzzahl, z.B. 456, -4711 oder 0
(dann gibts noch Fließpunktzahlen, z.B. -34.0 oder 3.141582654)