Secure Login

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

AJalex
Average Member
Mesaje: 76
Membru din: Sâm Sep 27, 2008 3:54 pm

Secure Login

Mesajde AJalex » Lun Sep 05, 2011 2:07 pm

Salut, am si eu o problema:
Am creat un sistem de inregistrare/login cu parola encriptata in md5 iar loginul nu functioneaza si nu ii pot da de cap. Am incercat coduri mai complexe iar intr-un final am ajuns la unul chiar basic iar nici unul nu functioneaza.

Codul este urmatorul:

Cod: Selectaţi tot

<?php
           session_start();
           function login()
           {
       $connect = mysql_connect("localhost", "root", "meh");
       mysql_select_db('wnn_users', $connect);        
                  if($_SERVER['REQUEST_METHOD'] == "POST")
                  {
         $u = $_POST['u'];
         $p = $_POST['p'];
         $encrypted = md5($p);
         
         $sql = "SELECT * FROM user_profile WHERE username = '$u' AND password = '$encrypted'";
         $query = mysql_query($sql);
         $result = mysql_num_rows($query);
         if($result == 1)
            {
               echo "loged";
            }
         else
            {
               echo "wrong";
            }      

         
                  }
                  else
                         return form();
           }
           function form()
           {
                   return '
                 <form action="'.htmlentities($_SERVER['PHP_SELF']).'?p=login" method="post">
                     <table class="reg" style="margin-top:101px">
                               <tr><td class="field">Username </td><td class="register"><input style="width: 301px;" name="u" value="" type="text" /></td></tr>
                               <tr><td class="field">Password</td><td class="register"><input width: 301px;" name="p" value="" type="password" /></td></tr>
                        <tr><td align="center"><input type="submit" class="register" value="Login" /></td></tr>
                        <tr><td style="height: 301px;"></td></tr>
                       </table>
                  </form>';
           }
?>
<?php echo login(); ?>



Avatar utilizator
matheuzzy
Senior Member
Mesaje: 383
Membru din: Dum Apr 26, 2009 4:42 pm
Localitate: Bucuresti

Mesajde matheuzzy » Lun Sep 05, 2011 3:44 pm

fa putin debug in el. adica in locurile "sensibile" pune cate un echo, sa vezi ca ajunge acolo si mai ales ce intoarce.

pune un echo dupa if($_SERVER['REQUEST_METHOD'] == "POST")
un echo la SQL, ia-l si ruleaza-l in phpMyAdmin, vezi ce zice, de nu gaseste useru

nu recomand if($_SERVER['REQUEST_METHOD'] == "POST"), e posibil sa nu fie setata ca POST, pentru ca faci submitul la un URL cu GET

mult mai bine este sa verifici isset($_POST)

Avatar utilizator
teachme
Senior Member
Mesaje: 550
Membru din: Mar Aug 17, 2010 11:52 am

Mesajde teachme » Lun Sep 05, 2011 6:44 pm

ca sa iti afiseze ceva in loc de return form(); pune echo form();

Avatar utilizator
MihaiC
Senior Member
Mesaje: 1643
Membru din: Dum Mai 14, 2006 8:07 pm

Mesajde MihaiC » Lun Sep 05, 2011 8:59 pm

Nu am testat, dar te prinzi tu cum merge :P

Cod: Selectaţi tot


<?php
   session_start();
   
   /** Conectare */
   $connect = mysql_connect("localhost", "root", "meh");
    mysql_select_db('wnn_users', $connect);
   
   /** curatam ce primim din input-uri */
   function escape($str) {
      if (get_magic_quotes_gpc() == 1) {
         $str = stripslashes($str);
      }
      return mysql_real_escape_string($str);
   }
   
   /** functia de logare */
    function login() {
      if (!empty($_POST)) { // daca e setat post
         $u = escape($_POST['u']);
         $p = escape($_POST['p']);
         $encrypted = md5($p);

         $sql = "SELECT * FROM user_profile WHERE username = '$u' AND password = '$encrypted'";
         $query = mysql_query($sql) or die(mysql_error() . '<br />' . $sql); // In caz ca e vreo eroare
         $result = mysql_num_rows($query);
         if ($result == 1) {
            $row = mysql_fetch_assoc($result);
            $_SESSION['username'] = $row['username']; // incarcam valoarea intr-o variabila de sesiune
            header('Location: ' . $_SERVER['PHP_SELF']); // redirectare
            exit;
         } else {
            echo "wrong"; // in cazul in care nu se gaseste nimic in db
         }
      }
   }
   
   function isAuth() { // verificam daca e autentificat
      if (!empty($_SESSION['username'])) {
         return true;
      }
      return false;
   }
   
   function getUser() { // daca e autentificat atunci primim numele userului
      if (!empty($_SESSION['username'])) {
         return $_SESSION['username'];
      }
      return false;
   }
   
   function form() { // daca vroiai sa pui formularul intr-o functie :P
      ?>
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post">
       <table class="reg" style="margin-top:101px">
         <tr>
            <td class="field">Username </td>
            <td class="register"><input style="width: 301px;" name="u" value="" type="text" /></td>
         </tr>
         <tr>
            <td class="field">Password</td>
            <td class="register"><input width: 301px;" name="p" value="" type="password" /></td>
         </tr>
         <tr>
            <td align="center" colspan="2"><input type="submit" class="register" value="Login" /></td>
         </tr>
         <tr>
            <td style="height: 301px;" colspan="2"></td>
         </tr>
       </table>
      </form>
      <?php
   }
   
   /** Controller-ul */
   
   if (isAuth()) {
      echo getUser();
   } else {
      login();
      form();
   }



AJalex
Average Member
Mesaje: 76
Membru din: Sâm Sep 27, 2008 3:54 pm

Mesajde AJalex » Joi Sep 08, 2011 11:33 pm

In sfarsit ... net si notepad++ ...

Dar din pacate ... tot nu functioneaza ... am incercat atat de multe incat creierul meu este stors ...

Mai incerc ... daca reusesc ... si gasesc problema o sa postez .. sa nu pateasca si altii aceeasi chestie...

A da inca o scurta intrebare: tipul coloanei din tabel conteaza ? Cea in care este stocata parola este de tip varchar(20).

Avatar utilizator
MihaiC
Senior Member
Mesaje: 1643
Membru din: Dum Mai 14, 2006 8:07 pm

Mesajde MihaiC » Vin Sep 09, 2011 1:22 pm

Conteaza, md5 produce stinguri parca de 32 de caractere.
Asta ar fi problema ta.

edit:

Poti face ca sa nu mai modifici in db.

$encrypted = substr(md5($p), 0, 20);

AJalex
Average Member
Mesaje: 76
Membru din: Sâm Sep 27, 2008 3:54 pm

Mesajde AJalex » Vin Sep 09, 2011 4:35 pm

Azi noapte mi-a picat si mie fisa :))

Am rezolvat direct din db, sa nu mai complic codul ca nu lucrez singur si mna sa fie pe intelesul tuturor.

Multumesc

theramore
PHPRomania Supporter
Mesaje: 12
Membru din: Lun Aug 22, 2011 4:04 pm
Localitate: Slobozia
Contact:

Mesajde theramore » Joi Sep 15, 2011 1:45 pm

Uite ceva mai complex :


Cod: Selectaţi tot

<?php



class Login
{

private $_id;
private $_username;
private $_password;
private $_passmd5;

private $_login;
private $_access;
private $_token;
private $_errors;





public function __construct()
{

$this->_id = 0;
$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username'];
$this->_password = ($this->_login)? $this->filter($_POST['password']) : '';
$this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password'];
$this->_login = isset($_POST['login'])? 1 : 0;
$this->_errors = array();
$this->_access = 0;
$this->_token = $_POST['token'];

}


public function filter($var)
{

return preg_replace('/^[a-zA-Z0-9]{5,12}$/','',$var);

}


public function isloggedin()
{

($this->_login)? $this->verifypost() : $this->verifydatabase();

}


public function verifypost()
{

try
{

if(!$this->verifydata())
throw new Exception("Invalid data submission!");

if(!$this->verifydatabase())
throw new Exception("Invalid username/password!");

if(!$this->istokenvalid())
throw new Exception("Invalid form submission!");

$this->_access = 1;
$this->registersession();

}

catch(Exception $e)
{

$this->_errors[] = $e->getMessage();

}


}



public function verifydatabase()
{

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

$data = mysql_query("SELECT * FROM users WHERE username = '{$this->_username}' AND password = '{$this->_passmd5}' ");

if(mysql_num_rows($data))
{

list ($this->_id) = @array_values(mysql_fetch_assoc($data))? 1 : 0;
return true;
}
else
return false;

}


public function istokenvalid()
{

return(!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 1 : 0;

}

public function verifydata()
{

return (preg_match('/^[a-zA-Z0-9]$/', $this->_username) && preg_match('/^[a-zA-Z0-9]$/', $this->_password))? 1 : 0;

}


public function showerrors()
{

echo "<h3>Errors</h3>";

foreach($this->_errors as $key=>$value)
{

echo $value."<br>";

}

}





}
?>


Utilizare:


<?php

include("class.login.php");

$login = new Login();

if(isset($_POST['submit']){
$login ->messages();
}else{
$login->showerrors();
}
?>

Cod: Selectaţi tot



Daca ti se pare interesant post sa iti dau si structura bazei de date.


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 17 vizitatori