Dit is een stuk code dat anderhalf jaar geleden nog perfect werkte. Nu probeerde ik de site terug te openen (was enkel gesloten door een redirect), maar opeens werken een aantal key functionaliteiten niet meer, waaronder de login en authenticatie. Ik heb niets veranderd aan de code, maar de site wel verhuisd van dennisclaes.com naar dennisclaes.be Zelfde hosting, zelfde server, zelfde database.

Onderstaand stuk code doet (deed):

1) wachtwoord ontvangen van de login pagina
2) checken of die gebruiker nog actief is en of hij niet geblokkeerd is
3) checken of er meerdere gebruikers zijn met hetzelfde wachtwoord (don't ask ...:-) )
4) een sessie variabele invullen met de naam van de gebruiker
5) indien gewenst een cookie invullen zodat die persoon zich volgende keer niet meer hoef aan te melden
6) de gebruiker doorsturen naar de hoofdpagina

In een poging om te debuggen heb ik dat laatste in comment gezet, maar die code wordt TOCH uitgevoerd!!! Onderstaande code resulteert dus in het doorverwijzen naar de hoofdpagina, zonder authenticatie (want daar krijg ik de foumelding dat 'User' een undefined index is).

<?php
header("Cache-Control: private");
header("Pragma: no-cache");
session_start();
?>

<html>
<body>

<?
$Pass = $_POST["pass"];

$db = mysql_connect("******", "******", "******");
mysql_select_db("******",$db);

$sql = "Select Naam FROM ****** WHERE Wachtwoord = '" . $Pass . "' AND Actief='1' AND Blocked = 0";
$result = mysql_query($sql, $db);
if ($result === false) die(mysql_error());

$num=mysql_numrows($result);

if($num == 0)
{
echo "Wachtwoord is verkeerd of uw account is nog niet actief";
}
else
{
if($num > 1)
{
echo "Kan u niet inloggen momenteel, neem contact op met Dennis Claes: [email protected]";
}
else
{
$_SESSION['User'] = mysql_result($result, $i, "Naam");

if($_POST['Onthouden'] == true)
{
setcookie("Gebruiker", mysql_result($result, $i, "Naam"), time()+(3600*24*365));
}
//echo "<script>window.location='poker.php'</script>";
}
}

mysql_close($db);
?>

</body>
</html>

Wanneer ik de regel code die de gebruiker doorverwijst, gewoon wis, dan krijg ik de volgende letterlijke output in mijn browser:

1) { echo "Kan u niet inloggen momenteel, neem contact op met Dennis Claes: [email protected]"; } else { $_SESSION['User'] = mysql_result($result, $i, "Naam"); if($_POST['Onthouden'] == true) { setcookie("Gebruiker", mysql_result($result, $i, "Naam"), time()+(3600*24*365)); } } } mysql_close($db); ?>

In mijn .htacces staat reeds php_flag display_errors "1"

Heeft iemand een idee waarom mijn code na anderhalf jaar, zomaar opeens niet meer werkt? En waarom ik een deel van de code als output krijg in mijn browser?
Ah crap ... heb ik weer iets om naar uit te kijken dan in de toekomst ...

Maar voorlopig is dat dus nog geen issue. Ik heb idd nagevraagd bij mijn provider of de versie van PHP veranderd is en dit kreeg ik terug:

dennisclaes.be maakt gebruik van php 5.5. Deze versie staat er al wel een tijdje, hier zijn naar mijn weten geen grote updates voor geweest.
Gebruik volledig PHP-tags: <?php.
De short-tag welke je gebruikt is verwijderd.

En bereid je ook voor op de functies van de MySQLi-driver. De oude MySQL-driver zit niet meer in PHP 7 die versie 5.6 opvolgt.
Oh you're freaking kidding me!!! Idd, dat was dus het probleem (niet dat het nu werkt, maar nu krijg ik tenminste foutmeldingen waar ik iets mee kan doen. Maar komaan ... die website bestaat uit zowat 100 pagina's ... Om nu overal dat gaan aan te passen ...

Nog niet te spreken van de mysql connect functie die dan ook gaat verdwijnen ... dat gaat me dagen, zoniet weken werk kosten.

Alleszins super bedankt Ariën. You're a life saver.
setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.

Voor de setcookie(0 heb je al html output.
Dennis Claes op 25/08/2016 15:57:54

Oh you're freaking kidding me!!! Idd, dat was dus het probleem (niet dat het nu werkt, maar nu krijg ik tenminste foutmeldingen waar ik iets mee kan doen. Maar komaan ... die website bestaat uit zowat 100 pagina's ... Om nu overal dat gaan aan te passen ...

Gebruik eens goede editor zoals NetBeans IDE en gebruik de 'find & replace' mogelijkheid.

Nog niet te spreken van de mysql connect functie die dan ook gaat verdwijnen ... dat gaat me dagen, zoniet weken werk kosten.
Alleszins super bedankt Ariën. You're a life saver.

Thanks!
Ook hier kan je find & replace voor gebruiken, maar let wel op de argumenten van bepaalde functies. Vaak moet je de variabele van je connectie meegeven. Zie ook de manuals op php.net

Bedankt voor de tip, ik ga die editor een keer downloaden. Ik heb tot nu toe altijd in kladblok geprogrammeerd.

Is dat van die setcookie iets nieuws? Want ik zweer, de bovenstaande code heeft jarenlang gewerkt, zo, zoals hij daar staat. Het is enkel nu, door updates aan PHP dat er dus bepaalde zaken niet meer werken. Maar ik programmeer al jaren niet meer, dus ben niet meer echt "mee". :-)
Nee, dat is altijd zo geweest. Maar ik vermoed sterk dat 'output buffering' aanstond.
Oei, there you lost me. Ik neem aan dat dat een instelling is waar de provider voor zorgt?

In elk geval, ik krijg geen foutmelding meer op het session object.

Nu krijg ik

Notice: Undefined variable: i in /home/vhosting/c/vhost0074996/domains/dennisclaes.be/htdocs/poker/PokerStorePassword.php on line 38

Notice: Undefined index: Onthouden in /home/vhosting/c/vhost0074996/domains/dennisclaes.be/htdocs/poker/PokerStorePassword.php on line 39

Maar soit, daar zal ik eerst zelf even mijn hoofd over breken, kga jullie niet lastig vallen met elk probleem dat ik tegenkom, want dan zijn we volgende maand nog bezig. :-)

In elk geval al mega bedankt voor de hulp.
Wait, what.

Maak je in elke (standalone?) file een connectie? En verbreek je die aan het einde expliciet?

Het lijkt er niet op dat je met includes werkt? Dan regel je het maken van een connectie in één keer en op één plaats. Het beëindigen van een connectie hoeft ook niet expliciet, omdat dit altijd impliciet gebeurt aan het einde van de uitvoering van het/de script(s).

En deze:
<?php
$sql = "Select Naam FROM ****** WHERE Wachtwoord = '" . $Pass . "' AND Actief='1' AND Blocked = 0";
?>

Is een hele aparte.

Los van het feit dat deze code vatbaar is voor SQL injectie selecteert deze query de een naam behorend bij een (niet gehashed?) wachtwoord, maar er wordt nergens gecontroleerd of dit ook het wachtwoord is dat specifiek bij een bepaalde usernaam hoort, elk wachtwoord voldoet?! Moeten wachtwoorden uniek zijn in deze oplossing (oh wacht, als er meerdere resultaten zijn moet je even mailen :p)? En als je een wachtwoord raadt (maakt niet uit welke) ben je binnen?

Ik zou je dringend doch vriendelijk aan willen raden om deze code te onderwerpen aan een security audit en/of overwegen om deze opnieuw te schrijven.

Reageren