Pybou Posté 22 Avril 2008 Posté 22 Avril 2008 Bonjour à tous, j'ai récemment eu quelques problèmes avec un virus qui s'introduit sur 3 de mes sites. Je me doute donc bien que je ne dois pas être à jour niveau sécurité et me rend compte petit à petit que je ne l'ai jamais vraiment été. Il est temps que je clarifie certains choses pour protéger mon site et notamment les variables que je reçois via formulaire puis que je place dans ma BDD pour enfin les afficher sur une page. Comme expliquer ci dessus j'ai donc trois étapes majeures : 1 - Transmission des données du formulaire vers ma page de traitement des données : Quelle fonction faut-il utiliser pour extraire les données arrivant via le formulaire par la méthode POST. Pour ma part j'utilisais un extract() mais il semblerait que se ne soit plus d'actualité. Quelle fonction utilisée pour protéger les variables avant de les rentrer dans la BDD ? Je pense que cela dépend du type de données (nombre, texte ...) mais j'ai pas très bien compris quoi utiliser et quand :s 2 - Envoie des données dans la BDD : Y-a-t-il quelque chose de particulier à faire après avoir fait l'étape 1 lors l'exécution de la requête mysql ? 3 - Affichage des données sur une page : Y-a-t-il des fonctions à éviter ? Quelles précautions prendre lors du passage BDD/Page Web ? Je pense qu'il est nécessaire de bien distinguer ces trois étapes car je pense que beaucoup de sites fonctionnent sur ce modèle de Formulaire->BDD->Page Web. Merci d'avance Cordialement
Occi Posté 23 Avril 2008 Posté 23 Avril 2008 Bonjour, regarde du coté de htmlspecialchars(), htmlentities() et mysql_escape_string() sur php.net
Dadou Posté 23 Avril 2008 Posté 23 Avril 2008 Est ce que tu utilises un script comme dotclear, joomla, cmsmadesimple... ?
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 (modifié) Non non pas de script dans ce genre Sur une de mes pages de traitement des données, toutes les données que je reçois de formulaire sont ensuite insérées dans une BDD. J'ai crée la fonction suivante : <?php// Fonctions de protections des données que je reçois d'un formulairefunction protection($value){ $value = htmlentities(mysql_real_escape_string($value)); return $value;}?> donc par exemple pour protéger le titre d'une news que je reçois d'un formulaire je dois faire comme ça : <?php$titre_news = protection($_POST['titre_news']);mysql_query("INSERT INTO matable (titre_news) VALUES ('$titre_news')") or die (mysql_error());?> Est ce que ça suffit pour se protéger des injections mysl et des filtrées les données qui arrive via formulaire ? Je posterai la suite pour l'affichage sur une page après. P.S : y-a-t-il une technique pour extraire toutes les données que je reçois via formulaire ou est ce que je dois faire à chaque fois : $titre_news = protection($_POST['titre_news']); ? Merci de votre aide Modifié 23 Avril 2008 par Pybou
Occi Posté 23 Avril 2008 Posté 23 Avril 2008 (modifié) Je ferais plutôt l'inverse : mysql_real_escape_string(htmlentities($value)); mysql_real_escape_string() n'est pas une super protection mais cette fonction échappe les caractères comme ' et " pour éviter des injections SQL simple basées sur ' et " mis en commentaire via un formulaire. Voir la doc de PHP pour voir ce qu'elle fait exactement. Modifié 23 Avril 2008 par Occi
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 D'accord ok merci de ta réponse J'ai lu la doc mais en fait ça fait quoi de le faire dans l'autre sens ?
Occi Posté 23 Avril 2008 Posté 23 Avril 2008 (modifié) Histoire de faire les choses dans l'ordre : 1 > htmlentities($value) convertit des caractères pouvant l'être et surtout protège contre l'inclusion de balise HTML (dont le javascript). 2 > mysql_escape_string() échappes les caractères réservés à Mysql. Modifié 23 Avril 2008 par Occi
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 D'accord merci beaucoup pour ces très bonnes explications. Je vais mettre tous ça en application. Y-a-t-il une technique pour extraire toutes les données que je reçois via formulaire ou est ce que je dois faire à chaque fois : $titre_news = protection($_POST['titre_news']); ?
captain_torche Posté 23 Avril 2008 Posté 23 Avril 2008 Tu peux faire foreach($_POST as $key => $value) $$key = protection($value);
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 D'accord merci du bout de code. Ceci me retourne directement $titre_news par exemple ?
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 Je vous remercie, je mets tous ça en place et je reviens pour la suite.
petit-ourson Posté 23 Avril 2008 Posté 23 Avril 2008 En ce qui me concerne je ne ferai surtout pas de htmlentities avant l'insertion en base de données. Je me contenterai d'un "mysql_real_escape_string" J'utiliserai htmlentities uniquement au moment de l'affichage.
Pybou Posté 23 Avril 2008 Auteur Posté 23 Avril 2008 Pourquoi ne ferais-tu pas de htmlentities ? Ce qui donnerai ça : // Recupération des variables et protectionfunction protection($value){ $value = mysql_real_escape_string($value); return $value;}foreach($_POST as $key => $value)$$key = protection($value); Maintenant ma fonction n'a plus grand interet il vaudrait mieux faire ça : foreach($_POST as $key => $value)$$key = mysql_real_escape_string($value); Et à l'affichage vous feriez quoi ?
sparh Posté 24 Avril 2008 Posté 24 Avril 2008 (modifié) Salut, En faisant htmlentities avant l'insertion en base de donnée, tu te retrouve avec des caractères du type é et compagnie. Du coup après pour faire des recherches dans ta base de donnée (exemple: moteur de recherche interne) c'est pas génial. Par contre: êtes vous sur que protéger les données avant l'insertion que par mysql_real_escape_string est suffisant ? edit: a l'affichege htmlentities($laVariableAafficher) ; Modifié 24 Avril 2008 par sparh
pluriels Posté 24 Avril 2008 Posté 24 Avril 2008 (modifié) Bonjour, Même pour les formulaires assez long, je prends soin de récupérer proprement les variables. Il me paraît dangereux d'utiliser des variables non initialisées. L'article ci-dessous te donne des pistes et des indices pour sécuriser tes sites. Bienvenue dans le monde de la sécurité... Guide de la sécurité Lionel Modifié 24 Avril 2008 par pluriels
Pybou Posté 24 Avril 2008 Auteur Posté 24 Avril 2008 Merci pour ton lien Je vais imprimer tous ça et le lire. En attendant, j'en viens à l'affichage. Le fait d'avoir fait un mysql_real_espace_string() à ajouter des slashes. Lors de l'affichage du texte, je veux virer ces slashes mais garderen tant que tel les entités html si elles ont été introduites. function Slashehtml($value){ htmlentities(stripslashes($value)); return $value;} Je pensais donc créer une fonction qui regroupe ces deux là :s mais quand je fais un Slashehtml() tous s'affiche mais toujours avec les slashes ...
Occi Posté 24 Avril 2008 Posté 24 Avril 2008 (modifié) Salut, c'est parce que tu mets un coup d'épais dans l'eau function Slashehtml($value){ htmlentities(stripslashes($value)); // Transforme $value ok mais c'est tout return $value; // Retourne $value mais directement le paramètre passé dans ta fonction} Pour que ça fonctionne : function Slashehtml($value){ $value = htmlentities(stripslashes($value)); // Transforme $value return $value; // Retourne $value transformé} Sinon pour éviter le htmlentites() tu peux filtrer les caractères spéciaux avec une fonction qui utilise str_replace() avant de les insérer dans la BDD. Voilou Modifié 24 Avril 2008 par Occi
Pybou Posté 25 Avril 2008 Auteur Posté 25 Avril 2008 Super Merci je débute encore dans le PHP "avancé" donc merci beaucoup de votre aide je vous tiens au courant de la suite
nlx Posté 15 Mai 2008 Posté 15 Mai 2008 Bonjour, je me permet d'inclure ici 2 petits liens Le premier est une liste expliquée : http://ha.ckers.org/xss.html Le second est identique mais adapté aux bricoleurs : http://ha.ckers.org/xssAttacks.xml
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant