Loginscript mit mysql+sessions

Thundy

Mitglied
Hallo,

ich schreibe zZ ein kleines Loginscript für meine Homepage, das einfach nicht so will wie ich will.
Der Benutzer wird in einer Datenbank gespeichert, loggt sich über ein formular ein, dieses wird ausgewertet und dabei die session gesetzt. :)
MD5 hab ich als erstes wieder ausgebaut, weil ichs für die fehlerquelle hielt....jedenfalls bekomm ich jetz als ergebnis immer folgende ausgabe:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/virtual/grex-lycanum.de/htdocs/hbhp/login.php on line 28
Login failed
(Login failed is die echoausgabe für fehlgeschlagene logins)

die funktion an sich is eigentlich okay eingebaut, synthax sollte stimmen, etc...

ich nutze PHP5 und MYSQL5.

die datenbank ist erreichbar, die pfade der dateien und die verweise sollten auch stimmen...

hier mal der quelltext:


//Datenbank
CREATE TABLE portal_users (
ID INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
password VARCHAR(32),
email VARCHAR(80),
userlevel TINYINT
);

//login.html
PHP:
<form action="index.php?section=login1" method="post" class="loginformular" name="loginformular">
    <ol>
        <li>
            <label for="name">Name</label>
            <input type="text" name="loginrequest_id" id="loginrequest_id" />
        </li>
        <li>
            <label for="pass">Passwort</label>
            <input type="password" name="loginrequest_pass" id="loginrequest_pass" />
        </li>
        <li>
            <input type="submit" name="submit" value="Speichern" />
        </li>
    </ol>
</form>

//login.php
PHP:
<?php

    if(!isset($_POST['loginrequest_id'], $_POST['loginrequest_pass'])) {
        die("Bitte nutz das Formular.\n");
    }

    if(trim($_POST['loginrequest_id']) == "") {
        die("Bitte gib einen Namen ein.");
    }
    if(trim($_POST['loginrequest_pass']) == "") {
        die("Bitte gib ein Passwort ein.");
    }


    $loginrequest_id = $_POST['loginrequest_id'];
    $loginrequest_pass = $_POST['loginrequest_pass'];

    $sql = "SELECT
                ID, name, password, userlevel
            FROM
                portal_users
            WHERE
                name like ".$loginrequest_id." AND
                password = ".$loginrequest_pass." ";
    $result = mysql_query ($sql);
    $num_rows = mysql_num_rows($result);

        if ($num_rows != 1)
        {
            echo 'Login failed';
        } else
        {

        $data = mysql_fetch_array ($result);
        $_SESSION['ID'] = $data["ID"];
        $_SESSION['name'] = $data["name"];
        $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
        $_SESSION['level'] =  $data['userlevel'];

        echo 'Eingeloggt';
        }


?>

das ganze in der praxis kann man sich nochmal unter http://grex-lycanum.de/hbhp/index.php?section=login anschaun.

wäre schön, wenn mir jemand helfen kann.


Grüße, Thundy
 
Zuletzt bearbeitet:
es läst drauf schießen, dass dein MYSQL befehl falsch ist.

probier mal dat:

Code:
$sql = "SELECT
ID, name, password, userlevel
FROM
portal_users
WHERE
name = '".addslashes($loginrequest_id)."' AND
password = '".addslashes($loginrequest_pass)."'";
$result = mysql_query ($sql);

if (mysql_num_rows($result) != 1)
{
echo 'Login failed';
} else
so in etwa

aufjedenfall check den MySQL Befehl durch.
 
Hi,

einen String musst Du in MySQL in Hochkommata setzen ,z.B. WHERE loginName = 'ichbins' (s. Thopeto). Und Du solltest Dich dringend über SQL-Injections informieren. Ich kann mich bei Dir mit dem Benutzernamen '' OR 1 /* und beliebigem Passwort einloggen! Benutze da aber lieber mysql_real_escape_string() statt addslasshes().

LG
 
hui...."Eingeloggt".

lag also wirklich an der formulierung des query.. danke dir @Thopeto!


kuddeldaddeldu: da überforderst du mich gründlich, bin blutiger anfänger und arbeite mich erst langsam ein....mal schaun, was ich über diese Injections etc in erfahrung bringen kann.. :rtfm:
und das mit den hochkommata - muss einem doch jemand sagen.. :[ danke. :)


*Edith: hab mich mal bei http://www.addedbytes.com/php/writing-secure-php/ schlau gemacht und das ganze auf mein script übertragen..

PHP:
    $sql = "SELECT
                ID, name, password, userlevel
            FROM
                portal_users
            WHERE
                name = '".addslashes($loginrequest_id)."' AND
                password = '".addslashes($loginrequest_pass)."'";
daraus wird
PHP:
    $sql = "SELECT
                ID, name, password, userlevel
            FROM
                portal_users
            WHERE
                name = '".addslashes(' OR 1=1 #)."' AND
                password = '".addslashes($loginrequest_pass)."'";
anschließend prüfe ich die anzahl der dbeinträge für die das gilt:
PHP:
    $result = mysql_query ($sql);

    if (mysql_num_rows($result) != 1)
und deshalb konnte man sich mit dem OR-kram gestern nur beim mir einloggen, weil genau ein user in der db stand.....wenn man das nu durchzieht wärns 2, und 2 != 1.

aber mir fällt grad auf, der kluge einbrecher schreibt [code]' OR name = '"$irgendeinnameausderdatenbank"'. :(

o.g. seite schlägt folgende funktion vor, durch die ich die eingaben überprüfe:
PHP:
   1. function make_safe($variable) {
   2. $variable = addslashes(trim($variable));
   3. return $variable;
   4. }

adslashes maskiert also ' " \ NUL
und mysql_real_escape_string also \x00 \n \r \ ' " \x1a

das heißt letzterer macht das gleiche wie ersterer, blos ausgebaut mit mehr wichtigen zu maskierenden befehlen, deshalb verwende ich immer mysql_real_escape_string?
 
Zuletzt bearbeitet:
das heißt letzterer macht das gleiche wie ersterer, blos ausgebaut mit mehr wichtigen zu maskierenden befehlen, deshalb verwende ich immer mysql_real_escape_string?

naja, kommt drauf an, muss man ein wenig differenzieren...aber bei einem wichtigen Script, wie das login script, sollte man schon auf mysql_real_escape_string zurückgreifen.
 
Hi,

es kommt eher darauf an, wofür man maskieren muss. Für eine MySQL-Abfrage verwendet man mysql_real_escape_string. Dafür ist diese Funktion da. Die Zeichen, die damit maskiert werden, könnten sich in zukünftigen Versionen noch ändern.

LG
 
Also ich maskiere nur wenn ich 'ne Stelle hab wo was gespeichert wird, also mysql...also so ziemlich überall.
Um sicher zu gehen das die DB net gecrasht wird etc, nutze ich mysql_real_escape_string, und falls ich zb die Userliste ausgebe auch noch htmlspecialchars, damit mir da niemand ein Javascript oder ähnliches reinhaut. Da dann ' " < > \ maskiert sind, kann mir nurnoch # gefährlich werden....wie mach ich das? mit str_replace # -> \# ? Oder brauch ich das garnicht, weil Schaden kann man damit dann ja nicht mehr anrichten, oder?
Okay, hat sich dann erledigt. :) thx!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück