Cześć,
Mam hopla a punkcie bezpieczeństwa jednocześnie nie bardzo, tak naprawdę, się na tym znając, co sprawia że wole nie napisać projektu niż żeby był dziurawy... Walczę z tym, bo od półtorej roku stoję w miejscu z umiejętnościami.
Dla testu napisałem najprostszy z możliwych skrypt na zalogowanie się. Czy jest to pójście w dobrą stronę?
if (isset($_POST['nick'])) {
$nick = $_POST['nick']; unset($_POST['nick']);
$password = $_POST['password']; unset($_POST['password']);
// nick zastepuje email, cos unikatowego i dlatego po nim sprawdzam
$user = DB::query("SELECT * FROM users WHERE BINARY nick = :nick", [
DB::bind(':nick', $nick, "/^[a-zA-Z]+$/")
]);
// wiem że do tego jest metoda z pdo ale nie zaimplementowalem jej u siebie w klase
$countuser = $user->fetchAll();
$user = $user->fetch();
if (count($countuser) == 1) {
// nie hashowalem hasla bo nie to bylo moim celem
// sposob 1
$validNick = preg_match("/^" . $user['nick'] . "$/", $nick);
$validPassword = preg_match("/" . $user['password'] . "$/", $password);
if ($validNick && $validPassword) {
echo $user['note'];
} else {
echo "niepoprawne dane mój Panie";
}
/*
sposób 2
$validNick = preg_match("/^" . $user['nick'] . "$/", $_POST['nick']);
if ($validNick) {
$validPassword = preg_match("/" . $user['password'] . "/", $_POST['password']);
if ($validPassword) {
echo $user['note'];
} else {
echo "niepoprawne hasło mój Panie";
}
} else {
echo "nie ma takiego nicku mój Panie";
}
*/
} else {
echo "cos poszlo nie tak mój Panie";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>bezpieczne logowanie</title>
</head>
<body>
<form method="post" action="<?= $_SERVER['REQUEST_URI']; ?>">
<label>
login
<input type="text" name="nick" />
</label>
<label>
password
<input type="password" name="password" />
<label>
<button>logn in</button>
</form>
</body>
</html>
<?php
// wkleiłem klase z innego projektu by sie nie babrac z bazą od zera
class DB
{
private $stmt;
private static $values;
public static function query(string $sql, array $cons): \PDOStatement
{
try {
$dbObject = new DB();
$pdo = $dbObject->connect();
$dbObject->stmt = $pdo->prepare($sql);
$pdo = null;
if (count($cons) > 0) {
if (in_array(false, $cons)) {
echo "niepowodzenie walidowania danych";
//exit();
}
if (self::$values) {
foreach (self::$values as $key => $value) {
$dbObject->stmt->bindValue($key, $value);
}
}
}
self::$values = null;
$dbObject->stmt->execute();
return $dbObject->stmt;
} catch (PDOException $err) {
echo $err->getMessage();
exit();
}
}
public static function bind(string $alias, $val, string $con): bool
{
$defaultBindParam = array(
"int" => "/^[0-9]+$/",
"float" => "/^[0-9]+$/",
"double" => "/^[0-9]+$/",
"string" => "/^[0-9a-zA-Z]+$/",
"bool" => "^(1|0)$",
"date" => "/^[0-9]{1,4}-[0-9]{2}-[0-9]{2}$/"
);
if (isset($defaultBindParam[$con])) {
return DB::preg($alias, $val, $defaultBindParam[$con]);
} else {
return DB::preg($alias, $val, $con);
}
}
private function connect(): \PDO
{
try {
return new PDO("mysql:host=localhost;dbname=bezpiecznelogowanie", "root", "", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $err) {
echo $err->getMessage();
exit();
}
}
private static function preg(string $a, $v, string $c): bool
{
$c = trim($c, "/");
if (!preg_match("/" . $c . "/", $v)) {
return false;
}
self::$values[$a] = $v;
return true;
}
}