8795 sujets

Développement web côté serveur, CMS

J'ai complètement revu et corrigé mon code à partir de modèle que j'avais déjà fait auparavant que j'ai adapté. Le tout fonctionne bien. J'ai pas annoté pour alléger le code. Mais, je pense qu'il y a surement des modifications à faire pour l'améliorer.

Une image pour montrer ce que cela va donner :

upload/29862-ssdan.jpg

- en arrivant sur la page, un prompte est demandé via PHP_AUTH_USER sans page d'accueil.
- L'image ci-dessous montre le résultat.
- Quand on change l'une des deux information, ça indique "updated".

Il me reste à remplacer INPUT TYPE="TEXT" pour type password mais je dois créer un autre INPUT pour confirmer le mot de passe à changer.. ici, j'ai jamais fait ça.

Et pour finir, il me reste à "Encoder" le mot de passe qui sera insérer dans la base de données. Chose que j'avais fait déjà mais que j'ai dû retirer à cause que ça ne fonctionnait pas. Tien, un défit ici.

Si vous avez des suggestions à faire, merci de les faire savoir. Et ça peut inspirer quelqu'un.
Je n'utilise pas PDO à cause que mon fournisseur ne le permet pas.

<?php
session_start();

include('connect-db.php');
$result = mysql_query("SELECT * FROM dan_bmark WHERE id='1'") or die(mysql_error());  
  while($row = mysql_fetch_array( $result )) {
  
    $username = htmlentities($row['username']);
    $password = htmlentities($row['password']);
  
}
mysql_close();

if(isset($_GET['logout']))
{
  unset($_SESSION["login"]);
  echo "You have logout ".$username." ";
  echo "[<a href='" . htmlentities($_SERVER['PHP_SELF']) . "'>Login</a>]";
  exit;
}

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"]))
{
  header("WWW-Authenticate: Basic realm=\"Test\"");
  header("HTTP/1.0 401 Unauthorized");
  $_SESSION["login"] = true;
  echo "You are unauthorized ... ";
  echo "[<a href='" . htmlentities($_SERVER['PHP_SELF']) . "'>Login</a>]";
  exit;
}
else
{
  if($_SERVER['PHP_AUTH_USER'] == $username && $_SERVER['PHP_AUTH_PW'] == $password)
  {
    echo "You have logged in ".$username." ";
    echo "[<a href='" . htmlentities($_SERVER['PHP_SELF']) . "?logout'>Logout</a>]";
    
          
              include('connect-db.php');
              function renderForm($id, $username, $password, $error) {
                 if ($error != ''){
                 echo $error;
                 }
               ?> 
               <form name="formulaire" action="<?php echo htmlentities($_SERVER['PHP_SELF']) ?>" method="post">
               <input type="hidden" name="id" value="1"/>

               <fieldset>
               <legend>Authentification</legend>
               <label for="labelusername">Username </label><input type="text" maxlength="64" size="64" id="labelusername" name="username" value="<?php echo $username; ?>" /><br />
               <label for="labelpassword">password </label><input type="text" maxlength="64" size="64" id="labelpassword" name="password" value="<?php echo $password; ?>" /><br />
               </fieldset>

               <input type="submit" name="submit" value="Submit">
               <input type="reset" name="submit" value="Cancel">
               </form> 

               <?php
               }

               if (isset($_POST['submit'])) { 
                 if (is_numeric(1)) {
                   $id = '1';
                   $username = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['username'])));
                   $password = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['password'])));
                 
                 if ($username == '' || $password == '') {
                   $error = 'ERROR: Please fill in all required fields!';
                   renderForm($id, $username, $username, $error);
                 }
                 else {
                   mysql_query("UPDATE dan_bmark SET username='$username', password='$password' WHERE id='1'") or die(mysql_error()); 
                   renderForm($id, $username, $password, '');
                   echo 'Updated!';
                 }
                 }
                 else {
                   echo 'Error!';
                 }
               }
               else {

                   $result = mysql_query("SELECT * FROM dan_bmark WHERE id=1") or die(mysql_error()); 
                   $row = mysql_fetch_array($result);
                   
                   if($row)
                   {
                     $username = $row['username'];
                     $password = $row['password'];
                     renderForm($id, $username, $password, '');
                   }
                   else {
                     echo "No results!";
                   }
                 }
                 mysql_close();
    
  }
  else
  {
    unset($_SESSION["login"]);
    header("Location: " . htmlentities($_SERVER['PHP_SELF']));
  }
}
?>

Modifié par dan4 (15 Sep 2010 - 12:09)
Merci pour vos réponses rapides!

Au début avec le problème initial, j'avais une demande d'aide sur une question précise.
Mais lorsque j'ai transformé le script c'est devenu plus une demande de critique étant donné que j'avais résolu mon problème.

Je travaille sur le script pour l'améliorer et je vois toujours des manques que je pense pas sur le coup. Alors, j'ai pensé à une demande de critique qui ferait en sorte d'avoir des suggestions comme la plupart font quand quelqu'un propose un script et qu'on obtiens des critiques et des idées améliorées.

Hier, après l'envoi du deuxième message, j'ai réfléchi sur une question que je me posais :

Comment je vais exploité ce script pour protégé des pages? Vous savez quand on a une page à protéger, il y a un petit code qu'on mets au début des pages pour la protéger. Après, je me suis dit : possiblement en plaçant un include '';

Je pense que c'est une bonne idée de faire une demande de critiques.

Si des personnes veulent critiquer le script en vu d'apporter des améliorations, si c'est possible ici, je serais bien content et je pense que le sujet peut porter fruit à d'autres aussi. Merci.
OK...

Alors sur la forme :
> c'est une bonne idée de prendre l'habitude d'optimiser les requêtes SQL en spécifiant les noms de champs et donc de remplacer "Select * From" par "Select username, password From"
> tu utilises un while alors que tu fais une requête sur une valeur d'id qui va donc te renvoyer un unique enregistrement.
> un coup tu utilises htmlentities, un coup tu utilises htmlspecialchars donc si on a le malheur de mettre un accent dans le pseudo ou dans le password ça ne marche plus.
> pour se protéger des injections SQL il est inutile de faire
mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['username'])))
il suffit de faire
mysql_real_escape_string($_POST['username'])
> tu testes que tout est OK dans le cas où ton formulaire a été soumis mais s'il n'a pas été soumis tu refais une requête inutile puisque tu connais déjà $username et $password qui n'ont pas changé.
> si je change le pseudo ou le password ça m'oblige à me relogguer au cas où j'actualise la page.
> plutôt que htmlentities($_SERVER['PHP_SELF']) on écrit généralement htmlspecialchars($_SERVER['PHP_SELF']) ou mieux encore $_SERVER['SCRIPT_NAME']

Sur le fond :
> je vois bien l'intérêt d'utiliser $_SERVER['PHP_AUTH_USER']) et $_SERVER['PHP_AUTH_PW'] quand on n'a pas accès à une BDD mais ici ça n'est pas le cas.
> tu as visiblement prévu de modifier la valeur d'id puisqu'il est dans un INPUT hidden mais je ne vois pas bien comment tu pourrais le faire puisqu'il ne pourrait être connu qu'après s'être identifié. Du coup il ne sert à rien et tu vas être embêté pour gérer les différents utilisateurs... sauf si chacun accède à une table unique avec id toujours égal à 1 mais là encore il est inutile et tu ne peux connaître ce nom de table que s'il s'est déjà connecté. Bref on tourne en rond.
> en général un script de vérification d'identification est inclus au début de chaque page dans la partie protégée mais ici ça voudrait dire qu'un formulaire de mise à jour apparaîtrait à chaque fois ?
> étant donné que tu fais des redirection (via header) il faut forcément placer ce code avant le DOCTYPE sauf que parfois tu fais toi-même une écriture du formulaire donc toutes tes pages vont être invalides.

En résumé je pense que sur la forme et sur le fond c'est à revoir (et donc pas fait pour inspirer qui que ce soit Smiley cligne ) et que ce serait bien plus simple et plus propre d'avoir une table d'utilisateurs et de vérifier la validité login/password.
Modifié par Heyoan (16 Sep 2010 - 15:04)
Heyoan, j'aime votre critique et je vais m'y appliquer. Merci pour vos efforts, c'est apprécié. Smiley smile , je vous donnerai des résultats.

En plus, j'aime apprendre et me perfectionner.
Modifié par dan4 (17 Sep 2010 - 08:21)
Juste par curiosité (je te l'avais déjà demandé mais tu ne m'avais pas répondu) : quel est l'intérêt de citer dans son entier la dernière réponse postée ? Smiley murf
désolé, je n'avais pas vu la question.

Je pense que je prends une mauvais habitude de faire citer la réponse à toutes les réponses.
Je vais me corriger sur ça. Quand, une personne me répond, je fais citer mais c'est vrai que de tout mettre le message ça alourdi la réponse. Je réalise pas toujours que je peux faire juste répondre en pressant sur le bouton orange en bas ou bien faire citer et couper dans le texte.

Merci de me l'avoir dit. Smiley confused