Ik moest even snel een single login scriptje hebben tegen pottenkijkers :-)
Het werkt prima alleen bij inloggen wordt een hash opgeslagen, en daarna wordt deze vergeleken en wordt de hash 'vernieuwt'. Omdat ik een location header gebruik na het inloggen wordt dit beide uitgevoerd en dus twee hashes gegenereerd. Het is geen ramp, maar was benieuwd of iemand hier een idee over heeft. En gelijk een goed moment voor een check, aangezien twee ogen meer zien dan één.
<?php
defined('ROOT') or define('ROOT',dirname(__FILE__));
require_once ROOT . '/_config.php';
define('ACCESS_PASSWORD', '$argon2i$v=19$m=65536,t=4,p=1$bXFoSC9vYTZhWmNJVGtwYQ$FMYDTnYGuvtBjGM+oJTp/ByjXr1veFG5KBxVjssLKEM');
function generatehash() {
return base64_encode(openssl_random_pseudo_bytes(32));
}
$timenow = (new \DateTime())->format('Y-m-d H:i:s');
$access = false;
if($_SERVER['REMOTE_ADDR'] == REMOTE_ADDR) {
$access = true;
} else if(isset($_SESSION['hash'])) {
try {
$stmt = $db->prepare("
SELECT
hash,
hashtime
FROM
" . TABLE_PREFIX . "access
WHERE
hash = '" . $_SESSION['hash'] . "'
AND
hashtime >= (NOW() - INTERVAL 30 MINUTE)
LIMIT
0,1
");
$stmt->execute();
if($stmt->rowCount() > 0) {
$stmt = $db->prepare("
INSERT IGNORE
INTO " . TABLE_PREFIX . "access
(
hash,
hashtime
)
VALUES
(
:hash,
:hashtime
)
");
$stmt->bindParam(':hash', $hash, PDO::PARAM_STR);
$stmt->bindParam(':hashtime', $hashtime, PDO::PARAM_STR);
$hash = generatehash();
$hashtime = $timenow;
$stmt->execute();
if($stmt->rowCount() > 0) {
$access = true;
unset($_SESSION['hash']);
$_SESSION['hash'] = $hash;
}
} else {
unset($_SESSION['hash']);
$notes[] = 'Your session has expired';
}
}
catch(PDOException $e)
{
$debugMsg = 'Line: '.$e->getLine().'<br />'
.'File: '.$e->getFile().'<br />'
.'Message: '.$e->getMessage();
echo '<p>' . $debugMsg . '</p>';
}
} else if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['password']) && password_verify($_POST['password'], ACCESS_PASSWORD)) {
try {
$stmt = $db->prepare("
INSERT IGNORE
INTO " . TABLE_PREFIX . "access
(
hash,
hashtime
)
VALUES
(
:hash,
:hashtime
)
");
$stmt->bindParam(':hash', $hash, PDO::PARAM_STR);
$stmt->bindParam(':hashtime', $hashtime, PDO::PARAM_STR);
$hash = generatehash();
$hashtime = (new \DateTime())->format('Y-m-d H:i:s');
$stmt->execute();
if($stmt->rowCount() > 0) {
$access = true;
unset($_SESSION['hash']);
$_SESSION['hash'] = $hash;
header('Location: ' . $_SERVER['SCRIPT_NAME']);
exit();
}
} catch(PDOException $e) {
$debugMsg = 'Line: '.$e->getLine().'<br />'
.'File: '.$e->getFile().'<br />'
.'Message: '.$e->getMessage();
echo '<p>' . $debugMsg . '</p>';
}
} else $notes[] = 'Password incorrect';
}
if($access === false) {
?>
<!-- Hier het inlogformulier -->
<?php
exit();
}
?>