Hallo,

Ik ben momenteel bezig met een login script en ik krijg een functie niet aan het werk.

Ik zal eerst uitleggen wat de bedoeling is. Ik heb de volgende functie:


<?php
class Login
{
	function login($required_fields, $numeric, $bot)
	{
		?>
		<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
			<html>
			<head>
			<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
			
			<link href="styles/stylesheet.css" rel="stylesheet" type="text/css">
			<title>CMS - Content management system.</title>
			</head>

			<body>
				<div id="LoginContainer">
				<form name="Login" method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
					<fieldset>
						<legend id="Login">CMS login</legend>
						<div style="padding: 15px;">
							<div><input type="text" id="klantnummer" name="klantnummer" onFocus="if(this.value=='Klantnummer')this.value='';" onBlur="if(this.value=='')this.value='Klantnummer';" value="Klantnummer"></div>
							<div><input type="password" id="wachtwoord" name="wachtwoord" onFocus="if(this.value=='Wachtwoord')this.value='';" onBlur="if(this.value=='')this.value='Wachtwoord';" value="Wachtwoord"></div>
						    <br>
							<span style="padding-right: 15px;"><input type="submit" name="Submit" value="Login">
							<input type="hidden" id="antibot" name="antibot" value="">
						    <br>
							<br>
							<a href="#">Wachtwoord vergeten?</a>
							<?php
							if ($required_fields == true)
							{
							echo "<span style='color: red'>Vul alle forms correct in.</span>";
							}
							
							if ($numeric == true)
							{
							echo "<span style='color: red'>Het klantnummer bestaat alleen uit cijfers.</span>";
							}
							
							if ($bot == true)
							{
							echo "<span style='color: red'>Bot gedetecteerd. Uw Ip-adres is voor 5 minuten gebanned.</span>";
							}
							?>
							</div>
					</fieldset>
			  </form>
			  </div>
			</body>
			</html>
		<?php
	}
}
?>


Als je kunt zien is het een heel makkelijke functie, maar ik zet het lieven in classes/functies zodat ik het makkelijk kan aanroepen.

Nu wil ik alle ingevoerde waardes gaan controleren. Als iemand bijvoorbeeld bij klantnummer een injectie wilt plaatsen zou hij een foutmeldingen moeten krijgen. Het volgende code is als voorbeeld :


<?php
require_once('sql.class.php');
require_once('login.class.php');

$sql = new Sql();
$login = new Login();

$sql->connect();

//hier gaan wij kijken of de persoon kan inloggen
if($_SERVER['REQUEST_METHOD'] == "POST") 
	{
		$salt = "STT$(@&";
		
		if (!is_numeric($_POST['klantnummer']))
		{
			// stel je voor dat het klantnummer niet uit nummers bestaat maar ook uit character
				die($login->login(false, true, false));
				
				//wat je nu doet is dat je het script helemaal afsluit en via een parameter 2 een melding maakt dat het klantnummer uit getallen moet betaan.
			
		}
		else
		{			
				$klantnummer = $inputcheck->StripVar($_POST['klantnummer']);
				$wachtwoord = md5($salt.$inputcheck->StripVar($_POST['wachtwoord']));
				
					$query = "SELECT userId, rechten FROM accounts WHERE klantnummer = '".$klantnummer."' AND wachtwoord = '".$wachtwoord."'";
					$result = mysql_query($query) or die(mysql_error());
					
					//hier de verder login e.d.
		}
?>


Nu is het probleem dat hij deze parameters niet herkent? Ik heb de volgende foutmeldingen


Warning: Missing argument 1 for Login::login(), called in C:\domains\asdf.be\wwwroot\CMS\classes\index.php on line 12 and defined in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 4

Warning: Missing argument 2 for Login::login(), called in C:\domains\asdf.be\wwwroot\CMS\classes\index.php on line 12 and defined in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 4

Warning: Missing argument 3 for Login::login(), called in C:\domains\asdf.be\wwwroot\CMS\classes\index.php on line 12 and defined in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 4

en

Notice: Undefined variable: required_fields in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 31

Notice: Undefined variable: numeric in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 36

Notice: Undefined variable: injections in C:\domains\asdf.be\wwwroot\CMS\classes\login.class.php on line 41


Ziet iemand wat ik fout heb gedaan?
Doordat je de methode login() dezelfde naam hebt gegeven als de klasse wordt deze als constructor geinterpreteerd. Gevolg is dus dat deze methode direct uitgevoerd wordt bij het instantieren van de klasse.

Daarnaast is dit een totaal verkeerd gebruik van OOP, en is ook echt niet makkelijker...

Je kunt de afhandeling van je formulier toch gewoon boven je HTML code doen en dan tijdens de afhandeling een variabele aanmaken die je in de HTML echoed?

Kijk anders ook eens naar dit voorbeeld:

Uitgebreide formulier controle
Beste Blanche,

Ik wil het eigenlijk ook niet echt in OOP zetten oid. Maar omdat het in een functie staat kan ik het oproepen in een die, hierdoor stopt het script en komt hij geeneens aan bij mij query.

Het werkt iig wel. Ik zal voor de duidelijkheid mijn code plaatsen.

login.class.php

<?php
class Login
{
	function login_check($required_fields, $numeric, $bot)
	{
		?>
		<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
			<html>
			<head>
			<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
			
			<link href="styles/stylesheet.css" rel="stylesheet" type="text/css">
			<title>CMS - Content management system.</title>
			</head>

			<body>
				<div id="LoginContainer">
				<form name="Login" method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
					<fieldset>
						<legend id="Login">CMS login</legend>
						<div style="padding: 15px;">
							<div><input type="text" id="klantnummer" name="klantnummer" onFocus="if(this.value=='Klantnummer')this.value='';" onBlur="if(this.value=='')this.value='Klantnummer';" value="Klantnummer"></div>
							<div><input type="password" id="wachtwoord" name="wachtwoord" onFocus="if(this.value=='Wachtwoord')this.value='';" onBlur="if(this.value=='')this.value='Wachtwoord';" value="Wachtwoord"></div>
						    <br>
							<span style="padding-right: 15px;"><input type="submit" name="Submit" value="Login">
							<input type="hidden" id="antibot" name="antibot" value="">
						    <br>
							<br>
							<a href="#">Wachtwoord vergeten?</a>
							<?php
							if ($required_fields == true)
							{
							echo "<br><span style='color: red'>Vul alle forms correct in.</span><br>";
							}
							
							if ($numeric == true)
							{
							echo "<br><span style='color: red'>Het klantnummer bestaat alleen uit cijfers.</span><br>";
							}
							
							if ($bot == true)
							{
							echo "<br><span style='color: red'>Bot gedetecteerd. Uw Ip-adres is voor 5 minuten gebanned.</span><br>";
							}
							?>
							</div>
					</fieldset>
			  </form>
			  </div>
			</body>
			</html>
		<?php
	}
}
?>


login/index.php

<?php
//debugger
error_reporting(E_ALL);

//sessions
session_start();

//import all classes
require_once('classes/index.php');

//call functions anitflood against bruteforce.
$security->antiflood();

	if($_SERVER['REQUEST_METHOD'] == "POST") 
	{
		$salt = "STT$(@&";
		
		if (!is_numeric($_POST['klantnummer']))
		{
			die($login->login_check(false, true, false));
		}
		else
		{
			if(!empty($_POST['antibot']))
			{
				die($login->login_check(false, false, true));
			}
			else
			{
			
				if(empty($_POST['klantnummer']) || empty($_POST['wachtwoord']))
				{
					die($login->login_check(false, false, true));
				}
				else
				{
					//connect to mysql database
					$sql->connect();
					
						$klantnummer = $inputcheck->StripVar($_POST['klantnummer']);
						$wachtwoord = md5($salt.$inputcheck->StripVar($_POST['wachtwoord']));
						
							$query = "SELECT userId, rechten FROM accounts WHERE klantnummer = '".$klantnummer."' AND wachtwoord = '".$wachtwoord."'";
							$result = mysql_query($query) or die(mysql_error());
							
								echo mysql_num_rows($result);
				}
			}
		}
	}
	else 
	{
	$login->login_check(false, false, false);
}
?>


En nog 1 vraagje, is het veilig als je je query hebt uitgevoerd je connectie met je database weer te sluiten? Of is dit alleen jammer tijd als je meerder queries uitvoert per script?

Het gaat hier meer om veiligheid dan snelheid.
Jep, ik snap je gedachtegang wel, maar het is echt een nette manier van scripten. Bovendien is dit veel minder schaalbaar aangezien je je script vermoord op het moment dat er een fout is opgetreden, dat is in principe nergens voor nodig...

Lees ook eens mijn tutorial over foutafhandeling in PHP, waarin beschreven wordt hoe je de foutafhandeling op een nette manier kunt toepassen.

Aan je nette manier van scripten te zien, vermoed ik dat je niet heel veel problemen zult hebben om het op deze correctere manier aan te pakken. Tip: kijk naar de try-catch combinaties, op die manier kom je ook met de OOP manier te werken ;)

ps. Database verbindingen kun je in principe gewoon open laten. Aan het einde van het script worden ze immers vanzelf afgesloten...
Blanche,

Ik ken het try catch principe. Gebruik het zelf ook voor C# en JAVA. Maar hoe kun je dat toepassen op een controle of iets nummeriek is of niet?
Een klein voorbeeldje:
<?php
try
{
$iVar = 'integer';
if(!is_numeric($iVar))
{
throw new Exception('Deze waarde is niet numeriek');
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>

Reageren