Mijn script om een wachtwoord te resetten werkt het laatste stukje niet van.
Gaat waarschijnlijk om de functie function Reset_Password.
Hij ziet het 'process' niet waardoor er geen reset plaatsvindt.
Het sturen van de email gaat prima.
De code wordt netjes opgeslagen.
Komt ook overeen met de code die per email werd opgenomen.
Er wordt netjes overgeschakeld om het nieuwe wachtwoord in te vullen.
En dan houdt het op.
Want komt if(isset($process)) niet door.
Heb al van alles geprobeerd. Maar ik vind geen vreemde zaken.
Zelfde gebeurt ook bij 'Gebruikersnaam vergeten'.

Iemand advies?
Hier belangrijkste stukken uit de scripts:

PAGINA FORGOT_PASSWORD:

<?php
include_once 'processes.php';
$Login_Process = new Login_Process;
$Check = $Login_Process->Forgot_Password($_GET, $_POST);
$Request = $Login_Process->Request_Password($_POST, $_POST['Request']);
$Reset = $Login_Process->Reset_Password($_POST, $_POST['Reset']);
?>
<body>
<?php 
switch($Check) {
	case "<!-- !-->":
?>
<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">
<input name="code" type="hidden" id="code" value="<?php $_GET['code']; ?>" >
<input name="Reset" type="submit" value="Reset wachtwoord" id="Reset">
</form>
<?php 
		break;
	default:
?>
<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">
<input name="Request" type="submit" value="Verzoek email reset wachtwoord" id="Request"/>
</form>
<?php 
}
?>

VERWERKING IN PROCESSES:

function Forgot_Password($get, $post) {
	
	$code = $_POST['code'];
	if(!$code) { 
	$code = $_GET['code']; } 

$code2 = $i->get(CODE);
if ($code === $code2)
{
return "<!-- !-->";
break;
}
}

function Request_Password($post, $process) {
		
	if(isset($process)) {

echo $i->set(CODE,$code); 

Mail_Reset_Password($name, $code, $email);
				return "Er is een email verstuurd. Hiermee kun je het wachtwoord resetten.";
}
}

function Reset_Password($post, $process) {

		if(isset($process)) {	
$code = "";
$password_hash = $pass1;
echo $i->set(CODE,$code); 
echo $i->set(PASSWORD_HASH,$password_hash); 

Mail_Reset_Password_Confirmation($name, $email);
return "Wachtwoord is gewijzigd. Je kunt nu inloggen.";
}
}


[size=xsmall]Toevoeging op 05/12/2017 15:11:47:[/size]

Eindelijk gevonden na het doorlezen van mijn topic...
Was de echo vergeten bij $_GET.....
Je kunt isset niet gebruiken om binnen een functie te kijken of een variabele buiten die functie geset is.

Je zou bovenin je script dit kunnen doen:


<?php
    switch(true) {
        case isset($_POST['Reset']):
        // handel hier je reset af
        break;

        case isset($_POST['Request']):
        // etc
        break;
    }
?>

Je kunt isset niet gebruiken om binnen een functie te kijken of een variabele buiten die functie geset is.


Dat gebeurt dan ook niet ;) script2:28 $process word geset als tweede argument van de functie die gecalled word in script1:6. Wat inderdaad niet weg neemt dat je even je post moet controlleren met bijvoorbeeld een print_r($_POST) op regel 3 van script 1
Er zitten nogal wat — hoe zeg je dat aardig — opvallende ontwerpbeslissingen in deze code.

Bijvoorbeeld:

<?php
$Check = $Login_Process->Forgot_Password($_GET, $_POST);
?>


$_GET en $_POST zijn superglobals: variabelen die overal en altijd beschikbaar zijn. Die hoef je dus niet door te geven.

Dan toch maar even kijken waarom ze dan worden doorgegeven:


<?php
function Forgot_Password($get, $post) {
    
    $code = $_POST['code'];
    if(!$code) { 
    $code = $_GET['code']; } 

$code2 = $i->get(CODE);
if ($code === $code2)
{
return "<!-- !-->";
break;
}
}
?>


Hmm, onleesbaar. Eerst even fatsoeneren:


<?php
function Forgot_Password($get, $post)
{
    $code = $_POST['code'];
    if (!$code) { 
        $code = $_GET['code'];
    } 

    $code2 = $i->get(CODE);
    if ($code === $code2) {
        return "<!-- !-->";
        break;
    }
}
?>


Hé, deze functie heeft twee vereiste parameters $get en $post, maar die worden in de functie helemaal niet gebruikt! De functie gebruikt $_GET en $_POST, maar negeert $get en $post.

De functie heeft wel een object $i, maar waar komt dat dan vandaan?

Raadselachtig, maar de return "<!-- !-->"; maakt de mystiek compleet: een functie voor een vergeten wachtwoord retourneert HTML, maar wel HTML die verborgen moet blijven.

Wáárom? Nou daarom:


<?php 
switch($Check) {
    case "<!-- !-->":
?>
<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">
<input name="code" type="hidden" id="code" value="<?php $_GET['code']; ?>" >
<input name="Reset" type="submit" value="Reset wachtwoord" id="Reset">
</form>
<?php 
        break;
    default:
?>
<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">
<input name="Request" type="submit" value="Verzoek email reset wachtwoord" id="Request"/>
</form>
<?php 
}
?>


Dus deze magische "Sesam, open u" "<!-- !-->" betekent eigenlijk zoiets als true.

Dude…

En dan is <?php echo $_SERVER['PHP_SELF']; ?> ook nog eens veiligheidslek, omdat het een XSS mogelijk maakt.
Je kan die regel gewoon weglaten, met een lege action (action="") maak je al duidelijk dat de afhandeling van je je request in het zelfde bestand gebeurt.

Edit: Typo
<sidenote>Waarom noem je dit pertinent XXS? Het is XSS, niet XXS.</sidenote>

Bovenstaande code (van topicstarter) is weer min of meer een typisch voorbeeld van ik-moet-iets-doen-dus-doe-ik-alles-maar-tegelijk :). Doet me altijd denken aan Kinder surprise (maar dat zijn drie dingen!).

Logisch gezien moeten er twee (of wellicht vier) dingen gebeuren:
- het aanvragen voor het resetten van het wachtwoord (formulier + verwerking)
- het daadwerkelijk resetten van het wachtwoord (formulier + verwerking)

Scheid elk van deze stappen.

Het voordeel van het scheiden van deze stappen is in eerste instantie overzicht. Maar het maakt ook debuggen een stuk makkelijker door alles in hapklare brokken op te delen. Is er iets mis in de functionaliteit kun je vrij snel direct inzoomen op het probleem (en meestal ook de oorzaak) zonder ruis van allerlei andere functionaliteit die hier doorheen aan het jodelen is...

En als je dan je logingegevens kwijt bent (en uitgelogd bent geraakt), waar komt dan die $_GET['code'] vandaan? Curieus. (zoals TS al aangaf, code was niet volledig)
Het raadsel komt waarschijnlijk doordat jullie niet de volledige scripting hebben.
Alles wordt netjes doorgegeven, en ook geblokkeerd wanneer ik regels weglaat.
Is weliswaar oud script wat ik helemaal omgebouwd heb.
En Arien, die regelwijIging heb ik ook wel uitgevoerd, maar even verwijdered,
Omdat daarna problemen ontstonden.
Niet daardoor dus, haha.
Bedankt voor de reacties.
Maar die case "<!-- !-->": blijft wel verwonderlijk.
>> Het raadsel komt waarschijnlijk doordat jullie niet de volledige scripting hebben.

Ik zou zeggen ... lees de opmerkingen van Ward nog eens heel goed door.
En verder is het niet echt gebruikelijk om echo's te returnen in een een functie/method.
Misschien dat het zo duideljker is.
Was een oude inlog/registratie class, die ik al eerder had gebruikt.
Nu niet zoveel meer van over.
Ik heb ook wel geprobeerd met wat meer zaken te verwijderen of te veranderen.
Maar zo werkt het prima....
Heb er wel beperkt aantal keren inloggen aan toe gevoegd, en beperkte IP-controle.
Werk met 1 session code. Waar oude script alle persoonlijke gegevens in sessions gooide.
En ook andere opties toegevoegd.
Registratie is grotendeels klaar.
Was nu bezig te kijken naar wijzigen zonder ingelogd te zijn (geweest).
Dat kan bijv. gebeuren bij wachtwoord vergeten.
Daar kwam ik nog wat dingen tegen.

DIT IS DE PAGINA VERGETEN WACHTWOORD

<?php
include_once 'processes.php';
$Login_Process = new Login_Process;
$Check = $Login_Process->Forgot_Password($_GET, $_POST);
$Request = $Login_Process->Request_Password($_POST, $_POST['Request']);
$Reset = $Login_Process->Reset_Password($_POST, $_POST['Reset']);
?>
<body>
<?php 
switch($Check) {
	case "<!-- !-->":
?>
<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">

<div class ="right" style="margin-top:-8px; margin-right: 5px;"><a href= "#" onclick ='rename(); window.location ="main.php"'>Log In</a></div>
<h1>Reset Password</h1>
<div id ="red" <div id="red" style = "height: 30px; text-align: center;"><?php echo $Check.$Reset ?></div>

<div class="label" style="margin-left: 175px;">Nieuw wachtwoord:</div>
<div align="center"><input name="pass1" type="password" class="field" onfocus = "opmerking('min- 6-24 tekens. 1 x hoofdletter, 1 x kleine letter, 1 x cijfer')"></div>

<div class="label" style="margin-left: 175px;">Herhaal nieuw wachtwoord:</div>
<div align="center"><input name="pass2" type="password" class="field"/></div>

<input name="code" type="hidden" id="code" value="<?php echo $_GET['code']; ?>" >
<br />
<br />
<br />

<div class="right" style="margin-right: 168px;">
<input name="Reset" type="submit" value="Reset wachtwoord" id="Reset">
</div>

</form>
<?php 
		break;
	default:
?>

<form action= <?php echo $_SERVER['PHP_SELF']; ?> method="post">

<div class="right" style="margin-top:-8px; margin-right: 5px;"><a href= "#" onclick ='rename(); window.location ="main.php"'>Log In</a></div>
<h1>Verzoek wachtwoord resetten</h1>
<div id="red" <div id="red" style = "height: 30px; text-align: center;"><?php echo $Check.$Request; ?></div>

<div class="label" style="margin-left: 175px;">Email Adres:</div>
<div align="center"><input name="email" type="text" class="field"  id="email" onfocus = "opmerking('Vul hier je email in waarmee je geregistreerd staat.')"><div>

<br />
<br />
<br />
<div class="right" style="margin-right: 168px;">
  <input name="Request" type="submit" value="Verzoek email reset wachtwoord" id="Request"/>
</div>
</form>
<?php 
}
?>


DIT IS GEDEELTE VAN DE VERSCHILLENDE FUNCTIES IN DE CLASS:

function Forgot_Password($get, $post) {
	
	$code = $_POST['code'];
	if(!$code) { 
	$code = $_GET['code']; } 

// Hier worden de waarde $code vergeleken met de opgeslagen waarde $code2

if ($code === $code2)
{
return "<!-- !-->";
break;
}

function Request_Password($post, $process) {
		
if(isset($process)) {

// hier wordt de $code opgeslagen en email verstuurd met de $code;

}
}

function Reset_Password($post, $process) {

		if(isset($process)) {
		$code = $_POST['code'];
		$pass = $_POST['pass1'];
		$pass2 = $_POST['pass2'];

// Hier wordt de $code weer gereset in geheugen

// Hier wordt de mail verstuurd dat het wachtwoord is gewijzigd.

}
}		

Reageren