Veiligheid
roy - 07/02/2005 13:09 (laatste wijziging 07/02/2005 14:14)
PHP gevorderde
Ik heb een log-in systeempje.
Maar als je bent ingelogd zie je in de adresbalk je id-nummer, verhoog je dit nummer dan kom je in een ander id. Dit is uiteraard niet de bedoeling!!
Hoe kan je ervoor zorgen dat je in de adresbalk alleen het website adres ziet en verder niks?
Met Vriendelijke Groet,
Roy
16 antwoorden
Gesponsorde links
roy - 07/02/2005 13:21
PHP gevorderde
OK, maar kan je er niet voor zorgen dat het adres in de adresbalk niet veranderd?
numlockrond - 07/02/2005 13:24
Onbekend
met frames, maar dan kan men nog rechtstreeks naar een pagina surfen. Je login script is blijkbaar heel onveilig, kun je misschien beter herschrijven...
roy - 07/02/2005 13:29
PHP gevorderde
humm, er zit niks anders op denk ik.
Weer iemand toevallig een hele simpele? hoeft alleen maar login (naam+wachtwoord) en sessions?
Met Vriendlijke Groet,
Roy
Fenrir - 07/02/2005 13:42
PHP expert
Zie mijn vorige post:
<?php
if(!defined('SAFE')) die();
class user
{
static $userinfo = array();
static function construct()
{
if(isset($_SESSION['userinfo']))
{
USER::$userinfo = $_SESSION['userinfo'];
}
}
static function isloggedin()
{
if(!empty(USER::$userinfo))
{
return true;
}else
{
return false;
}
}
static function login($name, $pass)
{
if($data = Select("SELECT * FROM gebruikers WHERE loginnaam='" . addslashes($name) . "' AND wachtwoord='" . md5($pass) . "'"))
{
USER::$userinfo = $data;
$_SESSION['userinfo'] = USER::$userinfo;
return true;
}else
{
return false;
}
}
}
USER::construct();
?>
<?php
class user
{
{
if ( isset ( $_SESSION [ 'userinfo' ] ) ) {
USER:: $userinfo = $_SESSION [ 'userinfo' ] ;
}
}
{
if ( ! empty ( USER
:: $userinfo ) ) {
return true ;
} else
{
return false ;
}
}
static function login
( $name , $pass ) {
if ( $data = Select
( "SELECT * FROM gebruikers WHERE loginnaam='" . addslashes ( $name ) . "' AND wachtwoord='" . md5 ( $pass ) . "'" ) ) {
USER:: $userinfo = $data ;
$_SESSION [ 'userinfo' ] = USER:: $userinfo ;
return true ;
} else
{
return false ;
}
}
}
USER:: construct ( ) ;
?>
<?php
if(USER::login($naam, $pass))
{
echo 'login gelukt!';
}
?>
<?php
if ( USER:: login ( $naam , $pass ) )
{
}
?>
Thomas - 07/02/2005 13:46 (laatste wijziging 07/02/2005 13:47)
Moderator
USER::$ userinfo
is dat niet uber-smerig (OOP-wise gezien) ?
Je zou voor elke object- of klassevariabele toch een methode moeten schrijven (getters en setters) ?
USER :: $userinfo is hetzelfde als $this->$userinfo en dat is nou niet bepaald het idee van OOP...
roy - 07/02/2005 13:59
PHP gevorderde
dat onderste kleine scriptje zet je dan op elke pagina die je wilt beveiligen na het inloggen?
Fenrir - 07/02/2005 14:04 (laatste wijziging 07/02/2005 14:07)
PHP expert
Volgens mij niet hoor, en de getters en setters, dat is eigelijk uber-smerig, maar in php kun je niet zoiets doen:
<?php
class test
{
private $test
get{
return $test
}set
{
$test = strval($value);
}
}
<?php
class test
{
private $test
get{
return $test
} set
{
}
}
En als je dan een set methode schrijft, dan krijg je zoiets:
static function setusetinfo($val)
{
USER :: $userinfo = $val;
}
en dat maakt niet echt veel verschil.
Citaat:
USER :: $userinfo is hetzelfde als $this->$userinfo en dat is nou niet bepaald het idee van OOP...
Ehhm, waarom niet? behalve dan dat het $this->userinfo moet zijn ipv $this->$userinfo, is er toch niets mis mee?
En ik krijg geen notices met error_reporting(E_STRICT);
Citaat:
dat onderste kleine scriptje zet je dan op elke pagina die je wilt beveiligen na het inloggen?
nee, daar zet je:
if(!USER::isloggedin()) die('Je mag deze pagina niet bekijken!');
if ( ! USER
:: isloggedin ( ) ) die ( 'Je mag deze pagina niet bekijken!' ) ;
numlockrond - 07/02/2005 14:09
Onbekend
het is toch niet echt de bedoeling om vanuit een methode in een class een variabele uit diezelfde class static aan te roepen, daar heb je $this->... voor.
Als je alles in je class altijd statisch aanroept kun je ook gewoon zonder classes werken.
roy - 07/02/2005 14:12 (laatste wijziging 07/02/2005 16:00)
PHP gevorderde
<?php
if(!defined('SAFE')) die();
class user
{
static $userinfo = array();
static function construct()
{
if(isset($_SESSION['userinfo']))
{
USER::$userinfo = $_SESSION['userinfo'];
}
}
static function isloggedin()
{
if(!empty(USER::$userinfo))
{
return true;
}else
{
return false;
}
}
static function login($name, $pass)
{
if($data = Select("SELECT * FROM gebruikers WHERE loginnaam='" . addslashes($name) . "' AND wachtwoord='" . md5($pass) . "'"))
{
USER::$userinfo = $data;
$_SESSION['userinfo'] = USER::$userinfo;
return true;
}else
{
return false;
}
}
}
USER::construct();
?>
<?php
class user
{
{
if ( isset ( $_SESSION [ 'userinfo' ] ) ) {
USER:: $userinfo = $_SESSION [ 'userinfo' ] ;
}
}
{
if ( ! empty ( USER
:: $userinfo ) ) {
return true ;
} else
{
return false ;
}
}
static function login
( $name , $pass ) {
if ( $data = Select
( "SELECT * FROM gebruikers WHERE loginnaam='" . addslashes ( $name ) . "' AND wachtwoord='" . md5 ( $pass ) . "'" ) ) {
USER:: $userinfo = $data ;
$_SESSION [ 'userinfo' ] = USER:: $userinfo ;
return true ;
} else
{
return false ;
}
}
}
USER:: construct ( ) ;
?>
<?php
if(USER::login($naam, $pass))
{
echo 'login gelukt!';
}
?>
<?php
if ( USER:: login ( $naam , $pass ) )
{
}
?>
Moet ik dit zien als twee aparte bestanden??
session.php en login.php? zoiets
nb. Hier moet ik zelf een formuliertje bij maken? geen probleem dat heb ik al..
Thomas - 07/02/2005 14:28
Moderator
Citaat:
Volgens mij niet hoor, en de getters en setters, dat is eigelijk uber-smerig, maar in php kun je niet zoiets doen:
<?php
class test
{
private $test
get{
return $test
}set
{
$test = strval($value);
}
}
?>
<?php
class test
{
private $test
get{
return $test
} set
{
}
}
?>
Huh? wat ?! Nee dat is ook niet de bedoeling he ?
Wat dacht je hier van:
<?php
class test {
private $test;
function get_test() {
return $this->test;
}
function set_test($val) {
$this->test = $val;
}
}
?>
<?php
class test {
private $test ;
function get_test( ) {
return $this -> test ;
}
function set_test( $val ) {
$this -> test = $val ;
}
}
?>
Het hele idee van classes is volgens mij dat jij voorschrijft hoe en wanneer je bepaalde vars kunt accessen / veranderen, en dat help je met $bla1->$bla2 wel een beetje om zeep...
roy - 07/02/2005 16:01
PHP gevorderde
Zie mijn vorige post...
Moet ik het zien als twee bestanden?
Thomas - 07/02/2005 16:06
Moderator
Dat kan - je kan je class, en een aanroep van een object van die class (op een webpagina) in twee aparte bestanden zetten he ?
Je include dan de class als je er gebruik van wilt maken op een webpagina.
roy - 07/02/2005 16:39
PHP gevorderde
voorbeeld.php
<?PHP
// include de class
include("class.login.php");
// start de class
$cLogin = new login;
// check een sessie met de functie loginCheck
if($cLogin->loginCheck("username") == TRUE)
{
// ingelogd
echo "Logged in";
} else
{
// niet ingelogd
if($_SERVER['REQUEST_METHOD'] == "POST")
{
// formulier is verstuurd
// waardes ophalen met de functie loginPost
$sUsername = $cLogin->loginPost("username");
$sPassword = $cLogin->loginPost("password");
} else
{
// formulier printen
echo $cLogin->loginForm("dezepagina.php");
}
}
?>
<?PHP
// include de class
include ( "class.login.php" ) ;
// start de class
$cLogin = new login;
// check een sessie met de functie loginCheck
if ( $cLogin -> loginCheck ( "username" ) == TRUE )
{
// ingelogd
} else
{
// niet ingelogd
if ( $_SERVER [ 'REQUEST_METHOD' ] == "POST" )
{
// formulier is verstuurd
// waardes ophalen met de functie loginPost
$sUsername = $cLogin -> loginPost ( "username" ) ;
$sPassword = $cLogin -> loginPost ( "password" ) ;
} else
{
// formulier printen
echo $cLogin -> loginForm ( "dezepagina.php" ) ; }
}
?>
class.login.php
<?PHP
// start de class
class login
{
// functie login check
// checkt of een sessie bestaat
// returned een boolean
function loginCheck($sSessionName)
{
// checken of sessie geset is
if(IsSet($_SESSION[$sSessionName]))
{
// zoja, return true
return true;
} else
{
// zonee, return false
return false;
}
}
// login formulier
function loginForm($sAction)
{
// het formulier in een variabele sReturn zetten
$sReturn = "<form method='post' action='".$sAction."'>";
$sReturn .= "Username: <input type='text' name='username'><BR>";
$sReturn .= "Password: <input type='password' name='password'><BR>";
$sReturn .= "<input type='submit' name='submit' value='Inloggen'>";
$sReturn .= "<input type='reset' name='submit' value='Leeg velden'>";
$sReturn .= "</form>";
// formulier returnen
return $sReturn;
}
// post functie
function loginPost($sName)
{
// post de waarde uit de variabele sName
return $_POST[$sName];
}
// functie login
function login($sSessionName, $sSessionValue)
{
// zet de waarde van sSessionValue in de sessie sSessionName
$_SESSION[$sSessionName] = $sSessionValue;
}
}
?>
<?PHP
// start de class
class login
{
// functie login check
// checkt of een sessie bestaat
// returned een boolean
function loginCheck( $sSessionName )
{
// checken of sessie geset is
if ( IsSet ( $_SESSION [ $sSessionName ] ) ) {
// zoja, return true
return true ;
} else
{
// zonee, return false
return false ;
}
}
// login formulier
function loginForm( $sAction )
{
// het formulier in een variabele sReturn zetten
$sReturn = "<form method='post' action='" . $sAction . "'>" ;
$sReturn .= "Username: <input type='text' name='username'><BR>" ;
$sReturn .= "Password: <input type='password' name='password'><BR>" ;
$sReturn .= "<input type='submit' name='submit' value='Inloggen'>" ;
$sReturn .= "<input type='reset' name='submit' value='Leeg velden'>" ;
$sReturn .= "</form>" ;
// formulier returnen
return $sReturn ;
}
// post functie
function loginPost( $sName )
{
// post de waarde uit de variabele sName
return $_POST [ $sName ] ;
}
// functie login
function login( $sSessionName , $sSessionValue )
{
// zet de waarde van sSessionValue in de sessie sSessionName
$_SESSION [ $sSessionName ] = $sSessionValue ;
}
}
?>
Hij vergelijkt nu niks vanuit de database:s
en ik krijg deze foutmelding:
Warning: Missing argument 1 for login() in /var/www/html/Chris/class.login.php on line 44
Warning: Missing argument 2 for login() in /var/www/html/Chris/class.login.php on line 44
Thomas - 07/02/2005 17:03
Moderator
Bij het aanmaken van het object wordt de methode met dezelfde naam als de class uitgevoerd.
Je hebt daar staan:
$cLogin = new login;
dit moet zijn:
$cLogin = new login($sessienaam, $sessiewaarde);
Fenrir - 07/02/2005 17:49
PHP expert
Ik bedoel meer iets als dit:
http://www.cfde...es_Example
Zo moet het eigenlijk. Maar omdat php dat niet ondersteunt (wss wel in v6), kun je het met functies doen.
Gesponsorde links
Dit onderwerp is gesloten .