Avatar billede qub- Novice
08. maj 2004 - 18:26 Der er 6 kommentarer og
1 løsning

Login-System virker ikke

Hei eksperter!


Jeg har et lille problem med mit login-system.. Problemmet ligger i, at jeg faktisk ikke ved hvad problemmet er...(?)

Jeg kan hverken logge ind eller registrere mig, og jeg har selvfølgelig lavet lavet en tabel i min mysql database, og mysql info er korrekt..


Jeg paster lige en million koder:





Min mysql tabel ser således ud (via Eksport i phpmyadmin):

CREATE TABLE `game_users` (
  `id` int(10) NOT NULL auto_increment,
  `username` varchar(16) NOT NULL default '',
  `password` varchar(16) NOT NULL default '',
  `email` varchar(25) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `username` (`username`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;









dbConnect.php:

<?
$host = "...";
$user = "...";
$pass = "...";
$db  = "...";

$ms = mysql_pconnect($host, $user, $pass);
if ( !$ms )
    {
    echo "Error connecting to database.\n";
    }

mysql_select_db($db);
?>








Register.php:

<?php
    include ("dbConfig.php");

    if ( $_GET["op"] == "reg" )
        {
        $bInputFlag = false;
        foreach ( $_POST as $field )
            {
            if ($field == "")
                {
                $bInputFlag = false;
                }
            else
                {
                $bInputFlag = true;
                }
            }

        if ($bInputFlag == false)
            {
            die( "Problem with your registration info. "
                ."Please go back and try again.");
            }


        $q = "INSERT INTO `game_users` (`username`,`password`,`email`) "
            ."VALUES ('".$_POST["username"]."', "
            ."PASSWORD('".$_POST["password"]."'), "
            ."'".$_POST["email"]."')";

        $r = mysql_query($q);
       

        if ( !mysql_insert_id() )
            {
            die("Error: User not added to database.");
            }
        else
            {

            Header("Location: register.php?op=thanks");
            }
        }

    elseif ( $_GET["op"] == "thanks" )
        {
        echo "<h2>Thanks for registering!</h2>";
        }
       
    else
        {
        echo "<form action=\"?op=reg\" method=\"POST\">\n";
        echo "Username: <input name=\"username\" MAXLENGTH=\"16\"><br />\n";
        echo "Password: <input type=\"password\" name=\"password\" MAXLENGTH=\"16\"><br />\n";
        echo "Email Address: <input name=\"email\" MAXLENGTH=\"25\"><br />\n";
        echo "<input type=\"submit\">\n";
        echo "</form>\n";
        }
    ?>








Login.php:

<?php
    session_start();

    include "dbConfig.php";

    if ($_GET["op"] == "login")
        {
        if (!$_POST["username"] || !$_POST["password"])
            {
            die("You need to supply a username and password.");
            }
       
        $q = "SELECT * FROM `game_users` "
            ."WHERE `username`='".$_POST["username"]."' "
            ."AND `password`=PASSWORD('".$_POST["password"]."') "
            ."LIMIT 1";

        $r = mysql_query($q);

        if ( $obj = @mysql_fetch_object($r) )
            {

            $_SESSION["valid_id"] = $obj->id;
            $_SESSION["valid_user"] = $_POST["username"];
            $_SESSION["valid_time"] = time();


            Header("Location: members.php");
            }
        else
            {

            die("Sorry, could not log you in. Wrong login information.");
            }
        }
    else
        {
        echo "<form action=\"?op=login\" method=\"POST\">";
        echo "Username: <input name=\"username\" size=\"15\"><br />";
        echo "Password: <input name=\"password\" size=\"8\"><br />";
        echo "<input type=\"submit\" value=\"Login\">";
        echo "</form>";
        }
    ?>
Avatar billede sqren Nybegynder
08. maj 2004 - 21:02 #1
Får du nogen fejlmeddelelse?

Sæt dette bag på dine mysql kommandoer or die(mysql_error());
$r = mysql_query($q)or die(mysql_error());
Avatar billede sqren Nybegynder
08. maj 2004 - 21:04 #2
Desuden giver den ingen fejl hos mig...
Avatar billede rednex Nybegynder
09. maj 2004 - 00:40 #3
Det ser umiddelbart meget rigtigt ud. Men koden du viser er sårbar overfor SQL injection angreb. Det betyder at enhver med lidt snilde kan logge ind på siden uden at kende hverken brugernavn eller password. Sørg for altid at kontrollere at det brugernavn og password du får tilbage fra databasen svarer til det som brugeren har tastet ind, ellers er der 'åbent hus' for alle og enhver.
Avatar billede qub- Novice
10. maj 2004 - 08:24 #4
Kan du fortælle lidt "dybere" om det rednex? :)

Jeg har "stortset" fundet fejlen.. Det er noget med mysql, men alt mysql info er som det skal.. Forstår det ikke!
Avatar billede qub- Novice
10. maj 2004 - 08:26 #5
DOOH !!!

Har fundet fejlen - jeg har kommet til at include dbConfig.php, istedet for dbConnect.php :P

Men rednex, hvis du vil fortælle mig lidt mere om sikkerhed :)
Avatar billede rednex Nybegynder
10. maj 2004 - 12:59 #6
AAARRRGGGHHHH!!! Så har man siddet og forfattet en kæmpe lang smøre, og så forsvinder lortet når man trykker send!! Nå, forfra igen så :o(

SQL injection går ud på at få en SQL sætning til at se anderledes ud end det egentlig var meningen. En typisk SQL til at kontrollere brugernavn og password kan se sådan her ud:

SELECT * FROM users WHERE username='buller' AND password='hemmeligt'

Men hvis jeg nu er snedig, så skriver jeg:

' OR '1'='1

i felterne for brugernavn og password. Det vil få SQl sætningen til at se sådan her ud:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'

Denne SQL vil returnere samtlige brugere i databasen. Hvis man så kun kigger på om databasen har returneret et resultat inden man giver adgang, så sidder man i saksen. Mange bruger metoden med at kigge om der var et resultat af søgningen, og så gemme den første række i resultatet som brugernavn, password og diverse privilegier. Da det som regel er en form for administrator som ligger som den første record vil jeg altså blive logget ind som administrator. Men der er selvfølgelig råd for den slags. Man kunne jo sammenligne det brugernavn og password som kommer fra databasen, med det som brugeren har tastet ind. På den måde finder man ud af at ' OR '1'='1 ikke er lig med den_første_og_bedste_bruger.

Der findes imidlertid også andre former for SQL injection. Nogen kan være mere ondsindede end andre, f.eks. kan man stoppe en DROP DATABASE ind som så vil slette hele din database. Derfor er det altid en god idé at bruge addslashes() på alle felter som ryger ind i din SQL. Den sørger nemlig for at specielle tegn bliver escapet. Det giver samtidig den sidegevinst at dine brugere kan bruge specielle tegn i deres brugernavn og password, uden at vælte dit script.

Som man siger på udenlandsk: "Assumption is the mother of all fuck-ups". Det gælder i høj grad når man programmerer. Du må aldrig regne med at det som brugeren indtaster i et felt, er som det skal være. Husk at tillid er godt, men kontrol er bedre.
Avatar billede qub- Novice
26. maj 2004 - 20:04 #7
tak for for det rednex
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester