Jump to content
GIGN Forum

[php] Login Skripts


*jancis38*
 Share

Recommended Posts

šo vietu gan es nesauktu par "gudru"

PHP

<?

// ...

$query sprintf("INSERT INTO lietotaji (lietotajvards, parole, epasts, ip) VALUES ('$lvards', '$md5parole', '$epasts', '$ip');",         

             

quote_smart($lvards),

             

quote_smart($parole),

             

quote_smart($epasts),

             

quote_smart($ip));    

// ...

?>

Link to comment
Share on other sites

1) derētu palasīt, ko dara funkcija sprintf()

2) kāda jēga mainīgo apstrādāt pēctam, kad tas jau ir ievietots stringā?

EDIT: Bišķi atvainojos, nepamaniju, ka gandrīz sprintf() jēga ir saprasta, izņemot vienu. Šajā gadījumā stringā tiek jau gatava mainīgie un no tām stringa apstrādes funkcijām tur jēga nav nekāda. Ja būtu rakstīts šādi, tad viss ok:

PHP

<?

// ...

$query sprintf("INSERT INTO lietotaji (lietotajvards, parole, epasts, ip) VALUES ('%s', '%s', '%s', '%s');",         

             

quote_smart($lvards),

             

quote_smart($parole),

             

quote_smart($epasts),

             

quote_smart($ip));    

// ...

?>

Edited by X ID
Link to comment
Share on other sites

Sava index.php faila pashaa augshaa ieraksti sekojoshu kodu:

<?php
#iekļauj konfigurāciju
include("../config.php");
error_reporting(E_ALL);
#sāk sesiju
session_start();

if(isset($_GET['darbiiba']) and $_GET['darbiiba'] == 'iziet' and isset($_SESSION['ieligojies']))
{
    session_destroy();
    header("location: index.php");
}

if(isset($_POST['username']) and isset($_POST['password']))
{
    $username = quote_smart($_POST['username']);
    $password = quote_smart(md5($_POST['password']));
        
    $result = mysql_query("SELECT COUNT(*) FROM lietotaaji WHERE niks = $username AND parole = $password");
    if(mysql_result($result,0,'COUNT(*)') > 0)
    {
        session_regenerate_id();
        
        #ieliek sesijā datus
        $_SESSION['ieligojies'] = 1;
        
        $id = mysql_result(mysql_query("SELECT id FROM lietotaaji WHERE niks = $username AND parole = $password"),0,'id');
        $_SESSION['mans_id'] = $id;
    }
}

?>

Taja pasa faila atrodi vietu kur tev vajag lai ir login box un ieraksti sekojosu kodu:

            <?php
            }
            ?>
        </div>

        <div id="sidebar">
            <?php
            if(!isset($_SESSION['ieligojies']))
            {
            ?>
            <form action="" method="post">
                <fieldset>
                    <legend>Login</legend>
                    <label for="username">Username:</label>
                    <input type="text" name="username" id="username" value=""/>

                    <label for="password">Password:</label>
                    <input type="password" name="password" id="password" value=""/>
                    <div class="submit">
                        <input type="submit" name="login" value="Login" />
                    </div>
                </fieldset>
            </form>
            <?php
            }
            else echo 'čau';
            ?>

Protams neaizmirsti izveidot savaa datubaazee tabulu : lietotaaji ar 5 ailem

EXRTA

id int 10 auto_increment TE IEKEKSEE NO KREISAS PUSES 1.

niks varchar 255

parole varchar 32

epasts varchar 255

tips tinyint 1

Link to comment
Share on other sites

Uzcepu kautko tādu:

PHP

<?php

session_start

();

include(

"konfiguracija.php"); // šeit glabājas db dati.

$lietotajvards $_POST["lietotajvards"];

$parole $_POST["parole"];

$sql "SELECT * FROM $dbtabula WHERE lietotajvards='$lietotajvards' and parole='$parole'";

$rezultats mysql_query($sql);

$counts mysql_num_rows($rezultats);

if(

$counts==1)

{

    

session_register("lietotajvards");

    

session_register("parole");

    echo 

"ielogojies";

} else

{

    echo 

"neielogojies";

?>

Viss notiek kā vajag! Ievadu valīdus datus - bliežu pa login, un viņš man parāda:

echo "ielogojies";

Un kad es refrešoju lapu, viņš man parāda:

echo "neielogojies";

Šis:

session_register("lietotajvards");
session_register("parole");

tiek pilnībā ignorēts.

Vai arī es esmu izdarijis kautko nepareizi?

Link to comment
Share on other sites

Funkcija session_register() nedara to, ko tu gribi, lai viņa darītu.

Tev jādefinē sesijas mainīgais:

PHP

<?

  $_SESSION

[$key]=$value;

?>

Bet principā lietotājvārdu un paroli glabāt sesijā nav pārāk gudri. Kapēc? Sesijas id ir publiski pieejama informācija (sevišķi, ja tas tiek padots caur urli un urlis nosūtīts kādam draugam, draugs tiks autorizēts kā tu).

Es ieteiktu sesijā vai cepumā pieglabāt kautkādu uz haļavu ģenerētu mainīgo. Datubāzē pieglabājam šī mainīgā un vēl kautkā (kautkādi mainīgie, kas katram datoram būs savi) hašu, pēctam salīdzinam cepuma vai sesijas un šo unikālo mainīgo hešu ar datubāzē ierakstīto. Izkatās tas ~

PHP

<?

  

function login($uname,$passw,$exp=0){

      global 

$_SERVER;

      

$sql="SELECT id FROM `users` WHERE i_username='".mysql_real_escape_string($uname)."' AND i_password='".md5($passw)."' LIMIT 1";

      

$res=mysql_query($sql);

      if(

mysql_num_rows($res)<1){

      return 

false;

      }

      

$row=mysql_fetch_object($res);

      

$hash=md5(time()+rand(100000,999999));

      

$save=md5(md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']).$hash);

      

mysql_query("UPDATE `users` SET i_hash='".mysql_real_escape_string($save)."' WHERE id=".intval($row->id));

      

setcookie("authid",$hash,$exp,"/");

  }

  function 

authorize(){

      global 

$_COOKIE,$_SERVER;

      

$search=md5(md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']).$_COOKIE['authid']);

      

$sql="SELECT * FROM `users` WHERE i_hash='".mysql_real_escape_string($search)."' LIMIT 1";

      

$res=mysql_query($sql);

      return 

mysql_num_rows($res)<1?false:mysql_fetch_object($res);

  }

  function 

logout(){

      global 

$_COOKIE,$_SERVER;

      

$search=md5(md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']).$_COOKIE['authid']);

      

mysql_query("UPDAET `users` SET i_hash='' WHERE i_hash='".mysql_real_escape_string($search)."'");

      

setcookie("authid","",-1,"/");

  } 

?>

Link to comment
Share on other sites

  • 2 months later...

Tajā pašā datubāzē tabulā pieglabā attiecīgo levelu/flagus.

Pārsvarā tiek lietotas 2 pieejas:

1) Tiek dotas tiesības darīt kaut kādas darbības, ja tavs līmenis ir vienāds vai lielāks ar nepieciešamo

return $level>=$x ? true : false;

2) Tiek dotas tiesības darīt kaut kādu darbību, ja konkrētajam lietotājam ir nepieciešamais flags

return in_array($x,$flags) ? true : false;

Link to comment
Share on other sites

Skaidrs, sapratu.

Uzbūru kautko līdzīgi strādājošu, thanks.

Un kā veidot lietotāja profilu, lai to var apskatīt?

Šitas gan man nav skaidrs, ir reģistrēto lietotāju liste, kā skatīt lietotāja profilu?

Datubāzē lauka ID man nav, neuzskatu par nepieciešamu viņu lietot, nekā savādāk, kā pēc lietotajvārda izvēlēties neatliks.

Ceru uz kādiem piemēriem, lai ir skaidrs kā to darīt.

Link to comment
Share on other sites

Es gan būtu katram lietotājam piekšķīris id...

Nu ja tev primārā atslēga ir, piemēram, lietotājvārds, tad padod to un selektē.

Piemērā, piemēram, user.php?name=test (exit un visu pārējo liec kā tev vajag, vienkārši exit neizskatīsies smuki (: )

PHP

<?

  

if(empty($_GET['name'])){

    exit;

  }

  

$sql="SELECT * FROM `users` WHERE username='".mysql_real_escape_string($_GET['name'])."' LIMIT 1";

  

$res=mysql_query($sql);

  if(

mysql_num_rows($res)<1){

    echo 

'Jūzeris neeksistē';

    exit;

  }

  

$row=mysql_fetch_object($res);

  

var_dump($row);

?>

Link to comment
Share on other sites

publiski pieejama informācija (sevišķi, ja tas tiek padots caur urli un urlis nosūtīts kādam draugam, draugs tiks autorizēts kā tu).

Nunu, nav jau tik traki. Jaa, PHP publiski tiek suutiits tikai sesijas ID. Bet arii Tavus datus var nosniffot, un Tev security balstaas tikai uz $_SERVER['REMOTE_ADDR'] un $_SERVER['HTTP_USER_AGENT'] nemainiibu. Kameer tie paliek vieni un tie pashi, un visi publiskie dati ir identiski paartverti, tikmeer tavs skripts arii autorizeesies.

Vienkaarshaak ir tajaa pashaa sesijaa pieseivot abus REMOTE_ADDR un HTTP_USER_AGENT, no kuriem sesija tika palaista/izveidota. Un tikliidz shamie sesija laikaa mainaas - nesakriit sesijaa saglabaatais remote_addr & agent - taa sesiju destroyot un prasiit ielogoties pa jaunu. Efekts taads pats. Tikai tavaa gadiijumaa ir veelviens papildus cuukijs, t.i., sesija+cuukijs, kas ir arii vieniigais uzlabojums.

Edited by TI-83+ Silver
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...