8721 sujets

Développement web côté serveur, CMS

Bonjour... j'ai suivis un tuto pour faire un module news (simple!!!)

Pouvez-vous (si vous avez le temps et la patience) me dire si mon code n'est pas affreux?

Autre chose: à part avec htaccess et htpasswd, y a il un autre moyen de sécurisé la partie admin? Genre token + session (car sinon après s'être enregistré une fois, ben ça fonctionne tout le temps... de plus, parfois le htaccess déconne en surchargeant).

Voici le code:

Liste_news.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Liste des news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h2, th, td
        {
            text-align:center;
        }
        table
        {
            border-collapse:collapse;
            border:2px solid black;
            margin:auto;
        }
        th, td
        {
            border:1px solid black;
        }
        </style>
    </head>
      
    <body>
   
<h2><a href="rediger_news.php">Ajouter une news</a></h2>
<?php
 
require_once 'connect.php';
 
if (isset($_POST['titre']) AND isset($_POST['contenu']))
{
    $titre = addslashes($_POST['titre']);
    $contenu = addslashes($_POST['contenu']);
    if ($_POST['id_news'] == 0)
    {
 
       $retour = $bdd->prepare("INSERT INTO mynews VALUES('', '" . $titre . "', '" . $contenu . "', '" . time() . "')");
       $retour->execute();
    }
    else
    {
         
        $_POST['id_news'] = addslashes($_POST['id_news']);
         
        $retour = $bdd->prepare("UPDATE mynews SET titre='" . $titre . "', contenu='" . $contenu . "' WHERE id='" . $_POST['id_news'] . "'");
        $retour->execute();
    }
}
   
 
if (isset($_GET['supprimer_news']))
{
     
    $retour = $bdd->prepare('DELETE FROM mynews WHERE id=\'' . $_GET['supprimer_news'] . '\'');
    $retour->execute();
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th>Titre</th>
<th>Date</th>
</tr>
<?php
$retour = $bdd->prepare('SELECT * FROM mynews ORDER BY id DESC LIMIT 0, 10');
$retour->execute();
while ($donnees = $retour->fetch())
{
?>
<tr>
<td><?php echo '<a href="rediger_news.php?modifier_news=' . $donnees['id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="liste_news.php?supprimer_news=' . $donnees['id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['titre']); ?></td>
<td><?php echo date('d/m/Y', $donnees['timestamp']); ?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>



rediger_news:




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>R&eacute;diger une news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h3, form
        {
            text-align:center;
        }
        </style>
    </head>
      
    <body>
<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
<?php
require_once 'connect.php';
 
if (isset($_GET['modifier_news']))
{
    $retour = $bdd->prepare('SELECT * FROM mynews WHERE id=\'' . $_GET['modifier_news'] . '\'');
    $retour->execute();
    $donnees = $retour->fetch();
      
    $titre = stripslashes($donnees['titre']);
    $contenu = stripslashes($donnees['contenu']);
    $id_news = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification.
}
else
{
    $titre = '';
    $contenu = '';
    $id_news = 0;
}
?>
<form action="liste_news.php" method="post">
<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
<p>
    Contenu :<br />
    <textarea name="contenu" cols="50" rows="10">
    <?php echo $contenu; ?>
    </textarea><br />
      
    <input type="hidden" name="id_news" value="<?php echo $id_news; ?>" />
    <input type="submit" value="Envoyer" />
</p>
</form>
</body>
</html>


connect.php:

<?php try
{
     
    $bdd = new PDO('mysql:host=localhost;dbname=news', 'root', '');
}
catch(Exception $e)
{
    
        die('Erreur : '.$e->getMessage());
}
?>





Merci
Modifié par tinourson (15 Aug 2013 - 12:25)
Ya pire, mais selon le degré de propreté a que tu veux il y a plusieurs choses à dire. Le plus embetant, c'est la sécurité; la méthode prepare de PDO sers justement à échapper tes variables que tu inseres en bdd, mais en fisant comme tu fais, tu contournes cette sécurité et tu la re-crées (en moins bien) avec les addslashes.

Sinon sur le principe, c'est mieux de bien séparer le html et le php plutot que de les mixer tout au long du document.
sephitan a écrit :
Ya pire, mais selon le degré de propreté a que tu veux il y a plusieurs choses à dire. Le plus embetant, c'est la sécurité; la méthode prepare de PDO sers justement à échapper tes variables que tu inseres en bdd, mais en fisant comme tu fais, tu contournes cette sécurité et tu la re-crées (en moins bien) avec les addslashes.

Sinon sur le principe, c'est mieux de bien séparer le html et le php plutot que de les mixer tout au long du document.


Donc j'enlève simplement les addslashes?

Sinon j'ai fait ça entre temps:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>R&eacute;diger une news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h3, form
        {
            text-align:center;
        }
        </style>
    </head>
     
    <body>
<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
<?php
require_once 'connect.php';

if (isset($_GET['modifier_news'])) 
{
   
    $retour = $bdd->query('SELECT * FROM mynews WHERE id=\'' . $_GET['modifier_news'] . '\'');
    $donnees = $retour->fetch(PDO::FETCH_OBJ);
     
    $titre = stripslashes($donnees->titre);
    $contenu = stripslashes($donnees->contenu);
    $id_news = $donnees->id; // Cette variable va servir pour se souvenir que c'est une modification.
}
else 
{
   
    $titre = '';
    $contenu = '';
    $id_news = 0; 
}
?>
<form action="liste_news.php" method="post">
<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
<p>
    Contenu :<br />
    <textarea name="contenu" cols="50" rows="10">
    <?php echo $contenu; ?>
    </textarea><br />
     
    <input type="hidden" name="id_news" value="<?php echo $id_news; ?>" />
    <input type="submit" value="Envoyer" />
</p>
</form>
</body>
</html>





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Liste des news</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <style type="text/css">
        h2, th, td
        {
            text-align:center;
        }
        table
        {
            border-collapse:collapse;
            border:2px solid black;
            margin:auto;
        }
        th, td
        {
            border:1px solid black;
        }
        </style>
    </head>
     
    <body>
  
<h2><a href="rediger_news.php">Ajouter une news</a></h2>
<?php

require_once 'connect.php';

if (isset($_POST['titre']) AND isset($_POST['contenu']))
{
    $titre = addslashes($_POST['titre']);
    $contenu = addslashes($_POST['contenu']);
    
    if ($_POST['id_news'] == 0)
    {
      
       $retour = $bdd->prepare("INSERT INTO mynews VALUES('', :titre, :contenu, '" . time() . "')");
	   $retour->bindParam(':titre', $titre, PDO: [langue]ARAM_STR);
	   $retour->bindParam(':contenu', $contenu, PDO: [langue]ARAM_STR);
	   $retour->execute();
	 
    }
    else
    {
        
        $_POST['id_news'] = addslashes($_POST['id_news']);
        
        $retour = $bdd->prepare("UPDATE mynews SET titre=:titre, contenu=:contenu WHERE id='" . $_POST['id_news'] . "'");
		$retour->bindParam(':titre', $titre, PDO: [langue]ARAM_STR);
	   	$retour->bindParam(':contenu', $contenu, PDO: [langue]ARAM_STR);
	   	$retour->execute();
    }
}
  

if (isset($_GET['supprimer_news'])) 
{
    
    $retour = $bdd->exec('DELETE FROM mynews WHERE id=\'' . $_GET['supprimer_news'] . '\'');
	
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th>Titre</th>
<th>Date</th>
</tr>
<?php
$retour = $bdd->query('SELECT * FROM mynews ORDER BY id DESC LIMIT 0, 10');

while ($donnees = $retour->fetch(PDO::FETCH_OBJ))
{
?>
<tr>
<td><?php echo '<a href="rediger_news.php?modifier_news=' . $donnees->id . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="liste_news.php?supprimer_news=' . $donnees->id . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees->titre); ?></td>
<td><?php echo date('d/m/Y', $donnees->timestamp); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news.
?>
</table>
</body>
</html>


vous en pensez quoi?
j'enlève les addslashes?
Comment je peux séparer totalement le php de la page? je poste avec post dans une autre page, je traite et je renvoie sur cette page?
Modifié par tinourson (17 Aug 2013 - 01:34)
a écrit :
Donc j'enlève simplement les addslashes?


Dans l'idée oui, mais il faut surtout passer par le mécanisme d'échappement de PDO à la place. Regarde la documentation de la méthode prepare, il y a une syntaxe à respecter avec des :variable à mettre dans la requête.

a écrit :
Comment je peux séparer totalement le php de la page? je poste avec post dans une autre page, je traite et je renvoie sur cette page?


Tu peux commencer par mettre tout ton php en début de fichier de manière à n'avoir plus que de simples boucles et des echo dans ton html. Et toutes tes requêtes sql seront à peu près au même endroit.