WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Inloggings funktion (PHP) (https://www.wn.se/forum/showthread.php?t=1040542)

youheardit 2010-02-16 19:01

Inloggings funktion (PHP)
 
Tjena!
Först nu har jag börjat tvivla eller inse att min egen skrivna funktion för inloggning inte är så bra som den MÅSTE vara.
Skrev den för ett år sen med hjälp av en tutorialsite.

Mina kunskaper om PHP har höjts rejält under året och först nu när jag lägger tanken på det så känns den inte så bra.

så här ser koderna ut:
PHP-kod:

if(isset($_POST['login'])){

include
'../dbcon.php'//databas uppkopplingen

$user=$_POST['user']; 
$pass=$_POST['pass'];


$userstripslashes($user);
$passstripslashes($pass);
$usermysql_real_escape_string($user);
$passmysql_real_escape_string($pass);


$sql="SELECT * FROM users WHERE user='$user' and pass='$pass'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if(
$count==1){
$_SESSION['anv_id'] = mysql_result($result0"id");
header("Location: sidan.php");
}
else {
die(
"Fel inloggningsuppgifter");



Frågan här är att jag är rädd för att det finns någon form av BOT som försöker ta sig in till administrationen genom att skicka POST begäran till filen tills den hittar rätt uppgifter..

Och nej, jag kör inte md5 på lösenorden än.. vill först fixa till systemet.. :)

Tacksam för svar och idéer :)

Ha en trevlig afton!
//Philip Andersson!

tartareandesire 2010-02-16 19:43

Att inte köra krypterade lösenord är nog faktiskt den största bristen i ditt system så det kan du nog fixa till :) Du kan lika gärna köra sha1 (+ salt, helst dubbla) också eftersom det inte medför något merarbete.

Trial and error kan givetvis alla botar köra, vill du stoppa den möjligheten får du blockera användaren efter ett visst antal felaktiga inloggningar. Huruvida det är lönt eller inte beror väl mest på hur känslig informationen i administrationen är.

Sedan beror det ju lite på hur kollen på administrationssidorna ser ut.

Stripslashes? Magic quotes? Ska du ha en magic quotes-koll så lägger du det lämpligtvis i en inkluderad funktion istället.

SimonP 2010-02-16 22:40

Som sagt, du bör använda SHA1 + salt på lösenordet.

Nästa förbättring är att du lägger på ett till fält (INT) i databasen, kan kalla det för "tries", och för varje misslyckat lösenord ökar du och updaterar databasfältet tries med 1, vid t.ex. 5 misslyckade försök sätter du tries-fältet till (time() + 1800) (för 30 min. låstid)

Innan varje inloggning kollar du sen typ:
IF (tries > time() ) die('Your account has been locked due to too many failed login attempts')

Vissa grupper, t.ex Admin bör inte skyddas av tries-låsningen, annars kan någon medvetet låsa ute Admin.

Ovan är det enklaste och, med mina ögon, bästa sättet att hantera felaktiga inloggningar.

Vill man göra det ännu svårare för botar/hackers måste man skapa en separat tabell där man även kontrollerar antal försök per IP-nr.

youheardit 2010-02-16 23:24

Tack för era svar, smarta idéer :) det som gäller är tillgången till mitt CMS på en hemsida. Finns en admin. Eftersom ni rekommenderar sha1+salt så ska jag köra på det.

Ni tror inte det skulle kunna passa med tex recaptcha innan varje inloggning? (ungefär 1gång om dagen)

eller kan bottar, hackers komma förbi den med på något vis?

Tackar igen för era svar! :)

SimonP 2010-02-16 23:44

Citat:

Ursprungligen postat av youheardit (Inlägg 20342942)
Ni tror inte det skulle kunna passa med tex recaptcha innan varje inloggning? (ungefär 1gång om dagen)

eller kan bottar, hackers komma förbi den med på något vis?

Tackar igen för era svar! :)

Jo, om det gäller ett CMS där det är få användare så räcker det nog bra med captcha.
Googla bara först så du vet att din captcha inte är "knäckt".

Edit: å andra sidan, eftersom det är få användare och om du har ett bra lösenord så behöver du ju inte göra nått? Det är ju inte så att nån kan bruteforca ett bra lösenord...

Nihilnovi 2010-02-17 00:07

Lite simpel referenskod i ungefär samma login gjord i OOP fast me sha1 o salt.
Bör ej användas rakt av!!!

login.php
PHP-kod:

    $login = new Validate($_POST['username'],$_POST['password']);
    if(
$login->validateUser() != NULL) {
    
session_start();
    
$_SESSION['username'] = $_POST['username'];
    
$getid mysql_query("SELECT `id` FROM users WHERE `username` =  '{$_POST['username']}' LIMIT 1") or die("Database error.");
    
$setid mysql_fetch_object($getid);
    
$_SESSION['id'] = $setid->id

validate.php
PHP-kod:

    class Validate {
        
        public 
$username;
        public 
$password;
        
        function 
__construct($username,$password) {
            
            
$this->username $username;
            
$this->password $password;
            
        }
        
        public function 
validateUser() {
                
            
$sql "SELECT * FROM users WHERE username = '$this->username'";
            
$this->query mysql_query($sql);
            
            if (!
$this->query) {
                exit(
"Error");
                return 
FALSE;
            } else {
                
                
$row mysql_fetch_object($this->query);            
                
$this->hashedpassword sha1($this->password $row->passsalt);
                if(
$row->password != $this->hashedpassword) {
                    return 
FALSE;
                } else {
                    return 
TRUE;
                }
            }            
        }
    } 


Jonas 2010-02-17 06:13

Vad händer med din inloggning om jag inte har något att skicka? Dvs om $_POST['user'] är tom.
Detta beror helt och hållet på hur felhanteringen i php.ini & scriptet är inställd

StateCollapse 2010-02-26 11:00

Ser inga fel, men du bör ju köra något slags:
PHP-kod:

$userstripslashes($user);
$passstripslashes($pass);
$usermysql_real_escape_string($user);
$passmysql_real_escape_string($pass); 


sprite 2010-02-26 11:21

Humor från StateCollapse igen?

http://www.cout.se/php/918-inloggings-funktion-php.html

Han är väl admin på den sidan, eller har youheardit tagit över och blivit skitsofren?

youheardit 2010-02-26 11:57

Citat:

Ursprungligen postat av StateCollapse (Inlägg 20344135)
Ser inga fel, men du bör ju köra något slags:
PHP-kod:

$userstripslashes($user);
$passstripslashes($pass);
$usermysql_real_escape_string($user);
$passmysql_real_escape_string($pass); 


Kolla i koden på första posten ;)

Och sen Sprite: Avstängd för tillfället... :p


Alla tider är GMT +2. Klockan är nu 10:56.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson