8791 sujets

Développement web côté serveur, CMS

Bonsoir à toutes et tous Smiley cligne

En plein développement de mon blog perso et ne connaissant pas vraiment le PHP et les bases de données, je me suis amusé à faire un code afin de rentrer un nouvel article depuis une page de mon blog.

Il faut savoir les choses suivantes :

La page pour le rajout d'un article sera accessible par un htacess, donc avec un mot de passe

Je mettrais encore un champ pour rentrer un mot de passe dans le formulaire en lui-même.

Je n'ai pas mis de doctype, car c'est juste pour essayer.

Je sais que mon code est vulnérable au injections SQL, mais je voudrais pouvoir rentrer du code html dans mon formulaire pour évidemment qu'il ressorte dans l'article proprement dit sur le blog.

Supposons que je veuille 2 paragraphes, eh bien j'écrirais l'article dans le formulaire en mettant bien <p> avant et </p> après chaque paragraphe.

Donc si je mets un htmlspecialchars, cela ne jouera pas.

Voilà le code prototype, voyez-vous quelque chose à redire ?

Je vous remercie d'avance et vous souhaite une excellente soirée.

Marc

<form method="post" action="traitement2.php">
   <p>
       <label for="pays">Dans quel rubrique mettre cet article ?</label><br />
       <select name="categorie" id="categorie">
           <option value="Mécanique">Mécanique</option>
           <option value="Informatique">Informatique</option>
           <option value="Electronique">Electronique</option>
           <option value="Divers">Divers</option>
		   <option value="articles">Articles</option>
       </select>
	   </p>
	   <p>
	   <label for="pseudo">Titre de l'article</label> : <input type="text" name="titre" id="titre" />
   </p>
   
    <p>
       <label for="ameliorer">Article</label><br />
       <textarea name="article" id="article" rows="10" cols="50"></textarea>       
   </p>
   <input type="submit" value="Envoyer" />
</form>

 <?php
 if (isset($_POST["categorie"]) && !empty($_POST['categorie']) && isset($_POST["titre"]) && !empty($_POST['titre']) && isset($_POST["article"]) && !empty($_POST['article']))
{
  
	$categorie =($_POST['categorie']);
	$titre =($_POST['titre']);
	$article =($_POST['article']);
	
	
	$bdd = new PDO('mysql:host=localhost;dbname=testbase', 'root', '');
	$req = $bdd->prepare('INSERT INTO '.$categorie.'(date, titre, articles) VALUES(CURDATE(),:titre, :article)');
	$req->execute(array(
	'titre' => $titre,
	'article' => $article,));
	
	echo "<p>Les données ont bien été enregistrées dans la base de données </p>";
	}
	else
	{
	echo"<p> Tous les champs n'ont pas été correctement remplis !</p>" ;
	}
?>
Modérateur
marc.suisse a écrit :
Bonsoir à toutes et tous Smiley cligne

Bonjour!

marc.suisse a écrit :

La page pour le rajout d'un article sera accessible par un htacess, donc avec un mot de passe

Je mettrais encore un champ pour rentrer un mot de passe dans le formulaire en lui-même.

marc.suisse a écrit :

Je sais que mon code est vulnérable au injections SQL, mais je voudrais pouvoir rentrer du code html dans mon formulaire pour évidemment qu'il ressorte dans l'article proprement dit sur le blog.

Si tu es le seul à utiliser l'admin, les risques d'injection peuvent être mis de côté. D'autant plus qu'une version et config moderne de php & mysql éviteront les plus gros problèmes. De plus, il faut savoir que n'importe quel accès en bdd à partir d'infos dynamiques possède un risque d'injection. Lorsque tu parles de limiter les balises, le problème est du XSS, qui permet en gros d'insérer du code parasite dans une page. De nouveau si tu gères ça tout seul, c'est pas de première importance.

marc.suisse a écrit :

Je n'ai pas mis de doctype, car c'est juste pour essayer.

ni de html, body, head? Sérieux? Vu que je veux juste essayer tu fais volontairement des erreurs? Crée toi un template de page et tu n'aura qu'à faire de copier/coller.

marc.suisse a écrit :

Donc si je mets un htmlspecialchars, cela ne jouera pas.

Pas forcément besoin. strip_tags améliore déjà les choses (retire les balises sauf celles voulues). Ensuite on peut retirer tout ou en partie les attributs.

marc.suisse a écrit :

Voilà le code prototype, voyez-vous quelque chose à redire ?

Si c'est pour l'exercice, pourquoi pas réinventer la roue! Tu n’as pour l’instant qu’une création d’article. Lorsque tu voudras un CRUD complet (create. read. update, delete) tu remarqueras les défaillances structurelles suivant la manière de procéder.
Tu risques d’avoir des problèmes avec certains caractères, notamment le faux apostrophe ( ' ). De nouveau cela dépendra de la config de ton serveur, et il doit bien y avoir un sujet par semaine, sur ce forum, qui traite du problème Smiley langue

marc.suisse a écrit :

&lt;label for="pays"&gt;Dans quel rubrique mettre cet article ?&lt;/label&gt;

J’ai comme l’impression que ce label n’est pas pour le champ «pays», qui d'ailleurs n’existe pas!

marc.suisse a écrit :

Je vous remercie d'avance et vous souhaite une excellente soirée.

C’est un peu tard pour moi, mais merci tout de même. Une bonne journée! Smiley biggrin
Salut, merci pour ta réponse Smiley cligne

a écrit :
Si tu es le seul à utiliser l'admin, les risques d'injection peuvent être mis de côté. D'autant plus qu'une version et config moderne de php & mysql éviteront les plus gros problèmes. De plus, il faut savoir que n'importe quel accès en bdd à partir d'infos dynamiques possède un risque d'injection. Lorsque tu parles de limiter les balises, le problème est du XSS, qui permet en gros d'insérer du code parasite dans une page. De nouveau si tu gères ça tout seul, c'est pas de première importance.


Ok, je ne vais donc pas trop me soucier de ça et effectivement, je pense que j'ai confondu avec les failles XSS.

a écrit :
ni de html, body, head? Sérieux? Vu que je veux juste essayer tu fais volontairement des erreurs? Crée toi un template de page et tu n'aura qu'à faire de copier/coller.


J'avoue, je l'ai fais un peu à l'arrache juste pour voir, et en plus je l'ai déjà le template...

a écrit :
Pas forcément besoin. strip_tags améliore déjà les choses (retire les balises sauf celles voulues). Ensuite on peut retirer tout ou en partie les attributs.


Après recherche sur le web, cela me parait être pas mal effectivement, je peux donc "choisir" les balises qui seront acceptées.

a écrit :
Si c'est pour l'exercice, pourquoi pas réinventer la roue! Tu n’as pour l’instant qu’une création d’article. Lorsque tu voudras un CRUD complet (create. read. update, delete) tu remarqueras les défaillances structurelles suivant la manière de procéder.
Tu risques d’avoir des problèmes avec certains caractères, notamment le faux apostrophe ( ' ). De nouveau cela dépendra de la config de ton serveur, et il doit bien y avoir un sujet par semaine, sur ce forum, qui traite du problème


Alors là je pense que cela va être un gros morceau, il faut effectivement que je revoie tout ça.

En tout honnêteté, je pensais juste rentrer les articles dans la base de données lors de leurs création, mais si je devais agir dessus après, je serais passé directement par php myadmin.

Je vais donc voir comment améliorer ça, crois-tu qu'il faille aussi partir sur une architecture MVC que j'ai juste entendu parler rapidement ?

a écrit :
J’ai comme l’impression que ce label n’est pas pour le champ «pays», qui d'ailleurs n’existe pas!


Certes, il s'agit d'un vulgaire copié/collé que j'ai arrangé à ma façon et dont la mention pays m'a échappé... Smiley rolleyes

a écrit :
C’est un peu tard pour moi, mais merci tout de même. Une bonne journée!


Un peu tard ou un peu tôt, c'est selon, mais je te souhaite également une bonne journée Smiley lol

Merci encore à toi !
Modérateur
a écrit :
Je vais donc voir comment améliorer ça, crois-tu qu'il faille aussi partir sur une architecture MVC que j'ai juste entendu parler rapidement ?

On saute de la bicyclette à la Rolls-Royce! Des principes comme le MVC sont très bien mais si ce n'est pas pour faire un programme complet c’est un peu lourd à mettre en place pour un code qui pourrait prendre une centaine de lignes... (bien sûr tu peux le faire pour des raisons formatrices... )

Cependant le principe de mieux séparer est pas tout faux. Avoir plusieurs fichiers si tu veux développer plus c'est pas du luxe. Si tu mets en premier la logique métier et les accès bdd, et pour finir la sortie du code html (en dernier, nécessaire car il va falloir introduire le contenu de variables dans des champs et de toute façon c'est une bonne pratique somme toute logique traiter=>afficher ). Toujours dans l'esprit MVC mais sans l'appliquer vraiment tu peux créer un fichier php qui contiendra des fonctions d'édition/modification/suppression dans la bdd et qui allégera le code de ta logique pour le rendre plus compréhensible.

J’aime bien ce sujet car j’ai passé des centaines d’heures sur ce genre de problèmes, et maintenant je n’utilise que des frameworks ou des CMS... Mais en ayant mis les mains dans le cambouis, on comprend mieux comment faire tourner la machine Smiley langue !
Modifié par kustolovic (22 Feb 2012 - 15:07)