8791 sujets

Développement web côté serveur, CMS

Pages :
Bonsoir à tous,

(je suis plus graphiste que codeur alors je fais ce que je peux avec le php, merci de votre compréhension Smiley smile )

voila, j'ai réussis, après plusieurs jours..., a créer un formulaire sur une page qui reprends le login/pass de phpbb et qui redirige ensuite sur une autre page.
J'aimerais rajouter une session afin que l'on ne puisse pas accéder à la 2e page et que l'on soit rediriger sur la page principale de login. c'est assez clair ? Smiley smile

voici la page verif.php en question (est-elle bien codée déjà ?)

<?php

mysql_connect ("******", "*****", "*****")or die("Erreur à la connexion MySQL");
mysql_select_db(****);
$username = $_POST['username'];
$password = md5($_POST['password']); // en cryptant le mot de passe tapé en md5 comme phpbb
$query = mysql_query("SELECT username, user_password FROM phpbb_users WHERE username=\"". $username."\"");
$data = mysql_fetch_array($query);
switch($data['user_password']) {
case $password:

 header(
 "Location: index2.php");
                 
default:

echo "<SCRIPT language='javascript'>alert('Le mot de passe et/ou le login est incorrect.'); window.location.replace('index.php');</SCRIPT>";
}
?>

Merci à vous.. en espérant une réponse, car sur plusieurs forums de php personne ne se donne la peine de répondre Smiley decu

Bonne soirée !
Modifié par galacticsurfeur (30 Sep 2007 - 02:18)
salut

a écrit :
je suis plus graphiste que codeur alors je fais ce que je peux avec le php, merci de votre compréhension


pour moi c'est le contraire, pas de soucis


a écrit :
est-elle bien codée déjà ?


deux défauts dont un de taille


$username = $_POST['username'];
$password = md5($_POST['password']);


variables non filtrées === danger potentiel Smiley cligne

le mot de passe est crypté, c'est bien mais pas suffisant.filtrez le avant lui aussi.

l'autre affecte les performances, bien qu'içi, çà n'à pas trop d'importance, le code est court.le switch n'est pas utile içi, un if/else suffirait.

pour la session, pourquoi ne pas continuer celle de phpbb?

et comme vous l'avez demandé


echo "<SCRIPT language='javascript'>alert('Le mot de passe et/ou le login est incorrect.'); window.location.replace('index.php');</SCRIPT>";


echo "<script type='text/javascript'>alert('Le mot de passe et/ou le login est incorrect.'); window.location.replace('index.php');</script>";


et c'est valide Smiley cligne


$query = mysql_query("SELECT username, user_password FROM phpbb_users WHERE username=\"". $username."\"");



$query = mysql_query('SELECT username, user_password FROM phpbb_users WHERE username="'. $username.'"');


php vous dira merci

et puis tient, encore d'autres, or die(), il vaut mieux utiliser une condition prenant en compte la valeur de retour.çà laisse moins de liberté aux pirates potentiels, moins il en savent mieux c'est.avec cette syntaxe, php renvoi votre message mais aussi tout ce qu'il sait sur l'erreur et c'est dommage.une gestion des valeurs vides ou non est aussi nécessaire.et qu'advient t'il de votre message d'erreur js si je désactive javascript?la gestion des magic_quote_gpc est aussi utile à moins d'être sûr de sa config...mysql_real_escape_string() serait aussi bienvenue.
Merci pour la réponse.. Je vais faire les modifs des erreurs en JScript mais ce n'est pas faux concernant la désactivation de celui ci.. Je vais mettre une page à la place.

Par contre, pour les erreurs de codage : cela relève du chinois pour moi Smiley ohwell Pourriez vous le corriger en mettant des // pour m'expliquer ? je pense que je comprendrais beaucoup mieux..

Pour la session de phpbb, non car c'est beaucoup trop complexe :s la je voudrais juste protéger une seule page car il n'y aura rien d'autre dans cette partie.

Merci beaucoup pour votre aide Smiley smile
Excellente soirée.

if (!empty($_POST['username']) && !empty($_POST['password'])) {
   if (get_magic_quotes_gpc()) {
      //si option active, supprimez si vous etes sur que off
     if (is_string($username))
         stripslashes($username);
     if (is_string($password))
         stripslashes($password);
   }
    $username = trim(strip_tags($_POST['username']));
    $password = trim(strip_tags($_POST['password']));
    $password = md5($password);
} else {
     die('formulaire vide');
}

$connect = mysql_connect ("******", "*****", "*****");

if (!$connect) {
    die('impossible de se connecter');
}

$db_choix = mysql_select_db("****");

if (!$db_choix) {
   die('impossible de selectionner la table');
}

$sql = sprintf("SELECT username,user_password FROM phpbb_users WHERE username='%s'", mysql_real_escape_string($username));

$query = mysql_query($sql);

if (!$query) {
    die('pas de login et/ou passe correspondant');
} else {
     header("Location: index2.php");
}


le chinois traduit Smiley lol
Merci énormément pour la traduction Smiley smile Je vais étudier les différences déjà.

Et concernant les sessions? car c'est l'objet de mon post au départ =)
Sachant qu'il y aura aussi un script à insérer en haut de toutes les pages à protéger ..

Merci encore keran, c'est un plaisir d'etre aidé aussi rapidement !
sincérement, et j'en suis désolé mais si vous ne maitriser pas le code de phpbb et ses sessions, c'est mon cas bien que je l'utilise, laissez tomber.phpbb c'est pour les vrai de vrai...après cinq ans de php, je n'ose pas modifier autre chose que les templates et j'ai tout juste oser ajouter un js pour des citations aléatoires et modifier le pied de page et entêtes...le code de phpbb est vraiment modifiable sans dommages que par des codeurs qui en ont l'habitude.le code phpbb est construit pour être compatible avec toutes les versions de php et bases...autant dire que c'est un joyeux bordel pour s'y retrouver... Smiley bawling

celà dit, une session autre c'est possible en se servant de la base phpbb, mais pourquoi? dans quel but? être authentifié comme membre d'un forum?

a écrit :
Sachant qu'il y aura aussi un script à insérer en haut de toutes les pages à protéger


hà! c'est quoi?

une session s'initialise ou se continue ainsi, mais j'imagine que tu le sais déjà

session_start();
Oui, je comprends pour les sessions de phpbb mais justement, c'est un site différent bloqué pour les visiteurs et seuls les membres enregistrés pourront y accéder, d'ou le formulaire et la session qui bloquerait l'accès à index2.php par exemple. Sinon le visiteur malin tapera www.toto.com/index2.php et pourra donc y accéder... donc je voudrais juste le rediriger sur index.php si il n'a pas mis ses ID.


Et petite parenthèse sur ton script traduit du chinois complexe au chinois..hum simplifé Smiley cligne c'est que la vérification du login/pass ne fonctionnent pas, car si je met n'importe quoi, j'accède à index2.php... c'est un peu dérangeant hehe Smiley smile par contre si je ne rentre rien, j'ai bien "formulaire vide".

Merci encore et toujours Smiley smile
a écrit :
Et petite parenthèse sur ton script traduit du chinois complexe au chinois..hum simplifé c'est que la vérification du login/pass ne fonctionnent pas, car si je met n'importe quoi, j'accède à index2.php... c'est un peu dérangeant hehe par contre si je ne rentre rien, j'ai bien "formulaire vide".


hé ben, oui, il faut tester pour adapter...

mais attention, ce n'est pas du pinaillage, comme tu as l'air de le penser, c'est du code conforme et sécurisé, mais pas encore assez...il est ou le problème?

attention aux sarcasmes sur les forums...çà n'incite pas à trouver une solution pour une âme en peine fusse t'elle sympatique....
ah non mais je n'en doute pas une seconde ! Smiley smile mais je ne saurais trouver la faille qui fait que n'importe quel login/pass permet d'accéder à la page index2.php Smiley decu

Et pour la session, tu ne veux pas m'expliquer alors ... ? Smiley ohwell
a écrit :
si je met n'importe quoi, j'accède à index2.php...


d'où l'utilté des sessions et vérifs poussées...pour l'heure, je vais dormir Smiley ravi ,si tu veux, je réfléchirais demain.BY
Modifié par keran (29 Sep 2007 - 00:06)
salut

comme promis


<?php
session_start();

if (!empty($_POST['username']) && !empty($_POST['password'])) {
   if (get_magic_quotes_gpc()) {
      //si option active, supprimez si vous etes sur que off
     if (is_string($username))
         stripslashes($username);
     if (is_string($password))
         stripslashes($password);
   }
    $username = trim(strip_tags($_POST['username']));
    $password = trim(strip_tags($_POST['password']));
    $password = md5($password);
} else {
     die('formulaire vide');
}

$connect = mysql_connect ('******', '*****', '*****');

if (!$connect) {
    die('impossible de se connecter');
}

$db_choix = mysql_select_db('****');

if (!$db_choix) {
   die('impossible de selectionner la table');
}

$sql = sprintf("SELECT username,user_password FROM phpbb_users WHERE username='%s'", mysql_real_escape_string($username));

$query = mysql_query($sql);

if (!$query) {
    die('pas de login et/ou passe correspondant');
} else {
    session_regenerate_id();
    $_SESSION['username'] = $username;
    header("Location: index2.php");
}
?>

// dans index2 placé en haut de page

<?php
session_start();
if (isset($_SESSION['username'])) {
   //le reste de la page
} else die('vous n\'êtes pas autorisé à afficher cette page');
?>


c'est le principe pour utiliser une session.perso, plutôt que

header("Location: index2.php");


j'écrirais plutôt

echo '<a href="index2.php">lien vers fichier</a>';


il serait aussi intéréssant de récupérer l'ip et de la stocker en session pour comparaison.avec un code du genre


function recup_ip() {
    if (getenv("HTTP_CLIENT_IP")) {
       $ip = $_SERVER['HTTP_CLIENT_IP'];
    }
   elseif (getenv("HTTP_X_FORWARDED_FOR")) {
           $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
   }
   elseif (getenv("REMOTE_ADDR")) {
           $ip = $_SERVER['REMOTE_ADDR'];
   }
   else {
      $ip = 'adresse inconnue';
   }
   return $ip;
}
Merci Smiley smile Je viens de tester et j'arrive toujours à passer le formulaire en mettant n'importe quel login/pass ...

Sinon j'ai rajouté la seconde partie sur index2.php mais par contre, étant une page en xtml, si je place le contenu entre :

<?php
session_start();
if (isset($_SESSION['username'])) {

[b]MON CODE XHTML ICI[/b]

} else die('vous n\'êtes pas autorisé à afficher cette page');
?>

J'ai l'erreur : Parse error: syntax error, unexpected '<' in /mnt/web/www/giaptv/index2.php on line 8 ........ Smiley ohwell Smiley ohwell

Et pour la partie de l'IP, je rajoute ça dans le script qui gère l'envoi du formulaire ?

Merci =)
ok, je vérifie et rendez-vous vers 21h, je dois fermer.

le code xhtml tu l'insére comment, c'est du php, ne l'oublie pas Smiley cligne
rere

voilà et ne me dit pas que çà ne fonctionne pas Smiley lol , j'ai tester avec mon phpbb en local, c'est bon.

la page de vérif du formulaire, j'ai rajouter une vérif du password dans la requête, parce que tester mais pas utilisé, il est maintenant testé et intégré en session.et est placé des constantes pour les paramètres de connexion, plus sur.et corriger les codes à fond.


<?php
session_start();

/**
 * une constante(define) n'est pas modifiable et c'est excellent
 * pour la securite et la connexion
 *
 */
define('SERVEUR', 'localhost');
define('UTILISAT', 'root');
define('PASS', 'mon_passe');
define('DB', 'ma_base');

if (!empty($_POST['username']) && !empty($_POST['user_password'])) {
   if (get_magic_quotes_gpc()) {
      //si option active
     if (is_string($_POST['username'])) {
         stripslashes($_POST['username']);
     } else {
          die('<p>le type de la variable n\'est pas correct.<a href="fichier.php">retour</a></p>');
     }
     if (is_string($_POST['user_password'])) {
         stripslashes($_POST['user_password']);
     } else {
          die('<p>le type de la variable n\'est pas correct.<a href="fichier.php">retour</a></p>');
     }
   }
    $username = trim(strip_tags($_POST['username']));
    $password = trim(strip_tags($_POST['user_password']));
    $password = md5($password);
} else {
     die('<p>formulaire incorrect.<a href="fichier.php">retour</a></p>');
}

$connect = mysql_connect (constant('SERVEUR'), constant('UTILISAT'), constant('PASS'));

if (!$connect) {
    die('<p>impossible de se connecter.<a href="fichier.php">retour</a></p>');
}

$db_choix = mysql_select_db(constant('DB'));

if (!$db_choix) {
   die('<p>impossible de selectionner la table.<a href="fichier.php">retour</a></p>');
}

$sql = sprintf("SELECT username,user_password FROM phpbb_users WHERE username='%s' AND user_password='%s'", mysql_real_escape_string($username), mysql_real_escape_string($password));

$query = mysql_query($sql);

if (!$query) {
    die('<p>impossible de ce connecter.<a href="fichier.php">retour</a></p>');
} else {
     $donnee = mysql_num_rows($query);
}
           
if ($donnee == 0) {
    die('<p>Pas de login correspondant! <a href="fichier.php">retour</a></p>');
} else {
    session_regenerate_id();//apres identification correcte on regenere l'id
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
    header("Location: index2.php");
}
?>


la page protégée


<?php
session_start();
if (isset($_SESSION['username']) && isset($_SESSION['password'])) {
    echo '<p>acc&eacute;s &agrave; la page proteg&eacute;e possible</p>';
} else die('<p>vous n\'&ecirc;tes pas autoris&eacute; &agrave; afficher cette page. <a href="fichier.php">retour</a></p>');
?>


c'est bon, tu as ta session fonctionnelle et sécurisée.
Smiley confused Smiley confused Smiley confused Smiley confused tu vas m'en vouloir, mais en effet, ça ne fonctionne pas Smiley decu Meme avec le bon utilisateur, j'ai la meme page "formulaire incorrect" comme si je ne rentrais rien... j'ai bien changé et vérifié les coordonnées MyQSL et tout est correct.. je ne comprends pas Smiley decu

La page index2.php est bien bloquée cette fois ci Smiley smile Merci pour ta patience.

Tu saurais d'ou ca peut venir pour se logger?
çà fonctionne parfaitement chez moi et avec phpbb.mais si c'est un pb de formulaire incorrect c'est les champs de table qui sont en cause.vérifie çà.

les miens : username et user_password

attention aussi à çà :

if (!empty($_POST['username']) && !empty($_POST['user_password'])) {


le name du formulaire doit être identique aux valeurs post.
en effet Smiley smile il s'agissait du champs "password" renommé en "user_password" et ça fonctionne à merveille ! Smiley smile Smiley smile Smiley smile MERCI !

Il me reste a rajouter un lien "deconnexion" pour fermer la session en cours.. Je pense que je pourrais me débrouiller Smiley smile

un enorme merci à toi ! t'assure un max Smiley lol

A bientot !
YES!

pour fermer proprement une session


$_SESSION = array();
session_destroy();
et un header ou lien pour redirection


au delà de tout çà, ce que j'ai voulu faire c'est te faire comprendre que la gestion des erreurs et des données utilisateurs sont plus importantes enfin, aussi, que le but du code.en comparant ton code du début et celui çi des dizaines de lignes sont venues s'ajouter mais pas pour le plaisir de coder...garde, s'il te plait, cette façon de filtrer les variables pour tes futurs dévellopements php et il ne t'arrivera rien de facheux, ce sera ma récompense pour cet investissement.les dévellopeurs de ce superbe language ont tout fait pour qu'il perde cette étiquette injustifiée de scripts pour débutants, faisons en sorte de continuer ce chemin, php6 sera encore plus puissant...

ravi de t'avoir filer un coup de main, A+
Modifié par keran (30 Sep 2007 - 00:34)
Pages :