Goeie dag ik heb het onderstaand inlog script geschreven (met wat hulp)
maar loop nog op 1 klein ding vast.
Na het controleren van alle punten (en ze zijn correct ingevuld)
zou het script je door moeten sturen.
Dit doet hij alleen niet. Ik krijg ook geen foutmelding(en) te zien.
Misschien dat iemand ziet wat er mis is?

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

// Als de site online gaat, verander je true in false
// Het makkelijkst is om deze constante op één plaats in te stellen en niet in elk bestand opnieuw.
define('ENABLE_DEBUG', true); // zet op false wanneer online

session_start();
include 'includes/connection.php';

if ('POST' == $_SERVER['REQUEST_METHOD'] and 'login' == $_GET['cmd']) {
// Gebruikersnaam en wachtwoord vergelijken met gegevens in de database
$sSQL = "SELECT
login,
actief,
wachtwoord
FROM
members
WHERE
login = '" . mysql_real_escape_string($_POST['login']) . "'";
$rResult = mysql_query($sSQL, $connection);
// Controleren of de query is gelukt
if (false === $rResult) {
if (defined('ENABLE_DEBUG') and ENABLE_DEBUG) {
echo 'Er ging iets fout met de query (1) op de pagina inloggen.php:' . mysql_error($connection) . '(' . $sSQL . ')';
} else {
echo 'Er is een fout opgetreden probeer het later opnieuw';
}
} else {
// Controleren hoeveel resultaten er zijn
if (1 == mysql_num_rows($rResult)) {
// Er is één resultaat gevonden, dus gegevens fetchen
$row = mysql_fetch_array($rResult);
// Controleren of het account geactiveerd is
if (0 == $row['actief']) {
echo 'Het account is nog niet geactiveerd. Activeer deze eerst.';
}

// controleren of wachtwoord klopt
elseif (md5($_POST['pass']) != $row['wachtwoord']) {
echo 'wachtwoord/gebruikersnaam combinatie klopt niet.';
}

} else {
// Alle gegevens kloppen, dus sessie vullen
$_SESSION['inlogdata']['ingelogd'] = true;
$_SESSION['inlogdata']['remote_addr'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['inlogdata']['username'] = $row['login'];
}
}
}
// Hier gaan we DE persoon uitloggen
if (isset($_GET['cmd']) and 'logout' == $_GET['cmd']) {
$_SESSION['inlogdata']['ingelogd'] = false;
$_SESSION['inlogdata']['remote_addr'] = null;
$_SESSION['inlogdata']['username'] = null;

//echo "Je bent uitgelogd en wordt doorgestuurd"; // Een echo kan niet vóór header()!
header('Location: index.php');
exit; // Script stoppen
}

// Is DE persoon ingelogd en bestaan alle sessies? Dan wordt DE persoon doorgestuurd
if (isset($_SESSION['inlogdata']['ingelogd'], $_SESSION['inlogdata']['remote_addr']) and $_SESSION['inlogdata']['username']) {
// Gebruiker is ingelogd
//echo "Je bent ingelogd, je wordt door gestuurt"; // Een echo kan niet vóór header()!
header('Location: userdashboard.php');
exit; // Script stoppen
} else {

// Controleren of het IP-adres klopt
if ($_SESSION['inlogdata']['remote_addr'] != $_SERVER['REMOTE_ADDR']) {
echo 'Mogelijke hijack!';
}
}
mysql_close($connection);
?>
Even een paar opmerkingen/punten:

- gebruik geen mysql dat word zelfs afgeraden door php zelf, gebruik PDO of mysqli
- gebruik geen md5 maar gebruik een goede hash...
- bij uitloggen gebruikt session_destroy(), session_unset(), $_SESSION = array()
- Waarom controleren op een ip-adres?? (als je bijvoorbeeld op een ipad inlogd en wandeld van bijvoorbeeld school naar de trein dan heb je altijd al een ander ip adres en ip adressen willen op regelmatige basis wel eens wisselen.)
- Wat doet die , op regel 65 daar ?
- mysqli?? Hoe gaat dat in zijn werk? - Hoe pas ik dat toe in een query
- geen md5 gebruiken? ik heb wel wat gehoord van sha1 en sha256 maar dat is toch allemaal 1 pot nat?.
- uitloggen zal ik zeker nog eventjes naar kijken
- die , zou de andere sessie moeten koppelen aan die andere om te kijken of hij wel gevult is.
Ik heb hem al vervangen voor and maar ook dat werkt niet.
Ik blijf een lege pagina houden en door sturen doet ie niet.
mysqli_* heeft een andere werking achter de schermen.
In je script nagenoeg hetzelfde.
Maar wat let je om even op php.net te kijken naar [php]mysqli_query[/php]()?

MD5 heeft niet zo veel mogelijkheden. Veel minder dan een SHA256 met een salt/pepper. Google maar.

En [php]die()[/php] verbindt niets, maar laat het script voortijdig stoppen (doodgaan).
Zonder ook maar iets van een verbinding te sluiten, zooi op te ruimen: sterft het af.
Nergens voor nodig!

Regel 65 is heel raar.
Je isset() is prima... en dan komt dit:
<?php
and $_SESSION['inlogdata']['username']
?>

Dus $_SESSION['inlogdata']['username'] moet TRUE zijn om door te gaan.
Ik kan me dat niet voorstellen. Kortom, regel 65 is nog niet goed.
in $_SESSION['inlogdata']['username'] moet de gebruikersnaam staan van de gebruiker
in $_SESSION['inlogdata']['remote_addr'] moet het IP van de gebruiker komen te staan.

Daarnaast moet het ip in de sessie overeen komen met het ip van de internet provider
om eventuele hijacking te voorkomen. Als dat ook anders kan hoor ik het graag.

en hoe zou ik die regel anders kunnen doen als ik meer als 1 sessie wil controleren voor ik iemand door stuur?
Jacco Laan op 23/11/2012 20:36:39

in $_SESSION['inlogdata']['remote_addr'] moet het IP van de gebruiker komen te staan.

Daarnaast moet het ip in de sessie overeen komen met het ip van de internet provider
om eventuele hijacking te voorkomen.


Dat werkt nooit bij mobieltjes omdat die bij elke handeling een ander ip hebben.
Daar heb je toch tegenwoordig mobielvriendelijke website's voor beginnend met http://m.(rest van de website).extensie

Ik heb nu het hele IP controle eruit gesloopt, blijven er nog 2 sessies over die gecontroleerd moeten worden.
Het probleem blijft het zelfde.
Doorsturen doet ie niet. Ik blijf een lege witte pagina houden na het doorlopen van de voorgaande controles.

Hier mn script opnieuw

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

// Als de site online gaat, verander je true in false
// Het makkelijkst is om deze constante op één plaats in te stellen en niet in elk bestand opnieuw.
define('ENABLE_DEBUG', true); // zet op false wanneer online

session_start();
include 'includes/connection.php';

if ('POST' == $_SERVER['REQUEST_METHOD'] and 'login' == $_GET['cmd']) {
// Gebruikersnaam en wachtwoord vergelijken met gegevens in de database
$sSQL = "SELECT
login,
actief,
wachtwoord
FROM
members
WHERE
login = '" . mysql_real_escape_string($_POST['login']) . "'";
$rResult = mysql_query($sSQL, $connection);
// Controleren of de query is gelukt
if (false === $rResult) {
if (defined('ENABLE_DEBUG') and ENABLE_DEBUG) {
echo 'Er ging iets fout met de query (1) op de pagina inloggen.php:' . mysql_error($connection) . '(' . $sSQL . ')';
} else {
echo 'Er is een fout opgetreden probeer het later opnieuw';
}
} else {
// Controleren hoeveel resultaten er zijn
if (1 == mysql_num_rows($rResult)) {
// Er is één resultaat gevonden, dus gegevens fetchen
$row = mysql_fetch_array($rResult);
// Controleren of het account geactiveerd is
if (0 == $row['actief']) {
echo 'Het account is nog niet geactiveerd. Activeer deze eerst.';
}

// controleren of wachtwoord klopt
elseif (md5($_POST['pass']) != $row['wachtwoord']) {
echo 'wachtwoord/gebruikersnaam combinatie klopt niet.';
}

} else {
// Alle gegevens kloppen, dus sessie vullen
$_SESSION['inlogdata']['ingelogd'] = true;
$_SESSION['inlogdata']['username'] = $row['login'];
}
}
}
// Hier gaan we DE persoon uitloggen
if (isset($_GET['cmd']) and 'logout' == $_GET['cmd']) {
$_SESSION['inlogdata']['ingelogd'] = false;
$_SESSION['inlogdata']['remote_addr'] = null;
$_SESSION['inlogdata']['username'] = null;

//echo "Je bent uitgelogd en wordt doorgestuurd"; // Een echo kan niet vóór header()!
header('Location: index.php');
exit; // Script stoppen
}

// Is DE persoon ingelogd en bestaan alle sessies? Dan wordt DE persoon doorgestuurd
if (isset($_SESSION['inlogdata']['ingelogd']) and isset($_SESSION['inlogdata']['username'])) {
// Gebruiker is ingelogd


//echo "Je bent ingelogd, je wordt door gestuurt"; // Een echo kan niet vóór header()!
header('Location: userdashboard.php');
exit; // Script stoppen
}
mysql_close($connection);
?>
Zet eens een echo 'klaar'; helemaal onderin je script.
Dan krijg ik gewoon 'klaar' als output.
Er gaat dus iets mis maar ik weet niet wat.
Heb je wel een $_GET-waarde?
print_r($_GET);

En een $_POST?
print_r($_POST);
Met GET krijg ik dit op mn scherm:

Array ( [cmd] => login )

Met POST krijg ik dit op mn scherm:

Array ( [login] => Demo [pass] => 09011984az [submit] => inloggen )

Reageren