Je travaille sur un site Web qui a un formulaire de connexion. L'utilisateur peut saisir les informations, et si elles sont erronées, le site envoie une alerte. Cependant, le problème est que vous pouvez facilement accéder à la page après vous être connecté en modifiant le nom dans la barre d'adresse.
Vous pouvez facilement accéder à la page sans vous connecter, c'est donc mauvais. Pouvez-vous nous aider?
validation.php:
<center><h1>Donate Here!</h1></center>
Donate.php
<?php $name =$_POST['user']; $pass =$_POST['password']; //Test code //echo $pass; //End Test Code //Connection Code session_start(); $con = mysqli_connect('localhost', 'root', ''); if ($con->connect_error) { die("Connection failed: " . $con->connect_error); } mysqli_select_db($con, 'userregistration'); // Connection End //Query Code $s = "select * from usertable where name = '$name' and password = '$pass'"; //test //echo $s; $result = mysqli_query($con, $s); $num = mysqli_num_rows($result); if($num == 1){ echo "Hello " . $name; } else{ echo "<script>"; echo "alert('Incorrect Username or Password');"; echo "window.location.replace('login.html');"; echo "</script>"; } ?> <!--html code-->
3 Réponses :
Vous devez créer une session après une connexion réussie:
session_start(); if (!isset($_SESSION['username']) || empty($_SESSION['username'])) { // no session, redirect user to index.php header('location: index.php'); }
Maintenant, dans votre Donate.php, vérifiez si l'utilisateur est connecté en vérifiant si la session est définie:
session_start(); if ($num == 1) { $_SESSION['username'] = $name; }
Ne devrait-il pas être isset
au lieu de isSet
?
Je l'ai utilisé dans les deux sens. Je n'ai jamais eu de problèmes. S'il y a une raison pour laquelle vous ne devriez pas l'utiliser comme ça, je serais heureux de savoir;)
PHP est insensible à la casse pour les noms de fonctions.
Il ne fait aucun doute qu'il est insensible à la casse, mais vous devriez prendre l'habitude d'utiliser les fonctions telles qu'elles sont définies.
Si vous souhaitez restreindre Donate.php, essayez ceci
<?php session_start(); if (empty($_SESSION['user_id'])) { header('Location:login.php'); } ?> <center><h1>Donate Here!</h1></center>
bonjour, j'ai essayé cela a fonctionné. Cependant, si je saisis les bonnes informations dans le formulaire de connexion, cela me redirige toujours vers login.html. Peu importe ce que je fais, cela me redirige toujours. Comment réparer?
Vous devez définir une sorte de marqueur dans votre session pour marquer le fait que votre utilisateur est authentifié (connecté). Vous pouvez stocker l'ID utilisateur de l'utilisateur actuel dans $ _SESSION ['current_user_id']
.
Veuillez également noter que votre requête est une bonne cible pour l'injection SQL, alors n'oubliez pas d'échapper SQL à toutes les données que vous ajoutez à la requête SQL via mysqli_real_escape_string
validation.php:
unset($_SESSION['current_user_id']);
Sur toutes vos pages, au tout début mettez le code :
some_page.php:
if (!isset($_SESSION['current_user_id'])) { exit('Your session expiried!') } //... do some stuff
Pour déconnecter votre utilisateur, vous pouvez simplement désactiver $ _SESSION ['current_user_id']
logout.php:
//... $s = "select * from usertable where name = '" .mysqli_real_escape_string($con, $name). "' and password = '" .mysqli_real_escape_string($con, $pass) ."'"; $result = mysqli_query($con, $s); if ($row = mysqli_fetch_row($result)) { // row fecthed, user found $user_id = $row['user_id']; // Let expect that usertable has user_id column $_SESSION['current_user_id'] = $user_id; } else { echo "<script>"; echo "alert('Incorrect Username or Password');"; echo "window.location.replace('login.html');"; echo "</script>"; exit(); } //...
if (! isset ($ _ SESSION ['id'])) {exit ('Connectez-vous pour voir cette page!')}
- Exemple de ce qui doit être fait, je suis sûr que vous pourriez reconstituer le reste.Veuillez également sécuriser votre candidature. Ne stockez jamais les mots de passe non chiffrés dans votre base de données. Votre code est vulnérable aux injections SQL. Cela signifie qu'un hacker peut entrer dans votre base de données et voler les informations de votre base de données.