bidibulle Posté 2 Octobre 2009 Posté 2 Octobre 2009 Bonjour, J'ai un soucis avec mon site qui visiblement à été "pirater" et à envoyer d'après mon hébergeur 3000 spams. La page qui à été utiliser pour cela contient juste des codes "includes" et tout ce passe donc via les fichiers qui sont inclus, cette page utilise également une variable "GET" qui va chercher la page à inclure suivant la sous rubrique cliquer. Je supposes que le "pirate" à utilise la faiblesse des variables d'url, mais je ne vois pas trop comment pouvoir securiser. Est-ce que l'url rewriting est une solutions valable? ou autres choses évidemment? Merci de votre aide
captain_torche Posté 2 Octobre 2009 Posté 2 Octobre 2009 Comment se passe l'include en fonction des variables GET ? Si c'est de la manière suivante, c'est effectivement dangereux : <?php include($_GET['page'].'.php'); ?> Si c'est bien le cas, il faut prévoir ce que tu as le droit d'inclure, ou pas ! <?php switch($_GET['page']) { case 'index': $include = 'index.php'; break; case 'contact': $include = 'contact.php'; break; default: $include = '404.php'; } include($include);?> Tu peux bien entendu ajouter autant de "case" que tu le souhaites, mais ça empêche qui que ce soit d'inclure des fichiers de ton serveur que tu n'auras pas prévus.
Message populaire. SStephane Posté 2 Octobre 2009 Message populaire. Posté 2 Octobre 2009 Hello, Non l'url rewriting n'est pas une solution valable puisque tu passeras toujours les mêmes variables via tes urls. Il y a une amélioration non négligeable au niveau de la sécurité car le nom de la variable est omis. Une autre amélioration facile à mettre en place est de désactiver l'affichage des erreurs sur le serveur de prod : du genre : <?php ini_set('display_errors', 0); ?> PLus spécifiquement pour ton souci d'include : http://www.certa.ssi.gouv.fr/site/CERTA-2003-ALE-003/ La réponse "ne jamais faire ça" est un peu abrupte, cela dit, lorsque tu le fias, le mieux est tout de même de vérifier que ton script a le droit d'être appelé par ta page (et éventuellement d'autres paramètres : utilisateur,ip ou que sais-je), et ce systématiquement. Je pense aussi que les includes n'ont rien à voir la dedans; tu spammes car tu ne protèges pas des données de formulaire de l'injection d'en-tête. Il te suffit pour cela d'éviter les sauts de ligne sur les champs "sujet" et "email" : />http://blog.developpez.com/julienpauli/p3017/securite-web/mail-header-injections/ Vérifier ces variables avant d'envoyer le mail résoudra ton problème. 1
bidibulle Posté 2 Octobre 2009 Auteur Posté 2 Octobre 2009 Re bonjour, je poste ci-dessous le message de mon hébergeur : l'url www.mon-domaine.be/services.php vient d'envoyer 3000 spams cette url ne contient pas de formulaire d'envoie de mail, ou quoi que ce sois du genre, juste <?php include($_GET['page'].'.php'); ?> et une variabe qui contient un texte à afficher si pas de variable get passée donc il me semble que dans mon cas la solutions de captain_torche, ci-dessous le code modifier avec les conseils de captain_torche : <?php$Services = "Lidentité visuelle de votre entreprise constitue un outil de communication puissant.<br /><br /> Un site Internet bien pensé, un logo bien construit, une brochure bien ficelée,... peuvent vous démarquer de la concurrence. Nous vous proposons de dynamiser votre image en vous apportant des conseils et des solutions durables dans un réel respect de votre culture dentreprise.<br /><br /> La présence sur le web est devenue un élément incontournable dans la communication d'une entreprise. Cest pourquoi nous travaillons dans le but de vous apporter des solutions sur mesure et un service de qualité conformément à vos besoins.<br /><br /> Dans cette optique, nous vous offrons nos compétences en matière de création et de mise à jour de sites, d'hébergement, de référencement et d'intégration d'éléments multimédias qui dynamiseront votre site internet et donc votre image.";?> <?php if(isset($_GET['p'])){ switch($_GET['p']) { case 'Concept': $include = 'Concept.php'; break; case 'Develop': $include = 'Develop.php'; break; case 'Host': $include = 'Host.php'; break; case 'Ref': $include = 'Ref.php'; break; case 'Main': $include = 'Main.php'; break; default: $include = '404.php'; } include($include); }else{ echo $Services; } ?> je voulais juste savoir, si avec cet modif j'était tranquille même contre les injections SQL? merci
captain_torche Posté 2 Octobre 2009 Posté 2 Octobre 2009 Rien à voir avec les injections SQL, malheureusement Pour contrer ces dernières, il faut passer toutes les variables issues d'un utilisateur ($_GET, $_POST), à travers la fonction mysql_real_escape_string(). Il y a sans doute d'autres optimisations à faire, mais ça sera un bon début. Par contre, si des spams sont envoyés, c'est que tu as fatalement un formulaire de contact. Il faudra le sécuriser lui aussi.
bidibulle Posté 2 Octobre 2009 Auteur Posté 2 Octobre 2009 J'ai effectivement des formulaires sur le site mais pas au niveau de la page service. c'est ça que je ne comprend pas, non comment le gars à peux faire du spamming à partir d'un script qui ne contient pas la fonction MAIL!!!
SStephane Posté 2 Octobre 2009 Posté 2 Octobre 2009 A partir du moment ou ta page service appelle le script de ton (en l'occurrence "son" ) choix, il a potentiellement toutes les fonctions de ton site (voire d'autres) à partir de service.php... J'en reviens à ce que je disais plus haut...sécurise les champs de formulaire susceptibles de générer des en-têtes mail...qu'il le fasse à partir de service.php ou du script en question, c'est pareil, tu spammeras toujours. Il ne peut envoyer des mails qu'en détournant tes scripts ou en injectant du code de toutes façons (ce qui serait plus grave pour la sécurité de ton serveur).
bidibulle Posté 2 Octobre 2009 Auteur Posté 2 Octobre 2009 (modifié) donc de la page x il peut utiliser le script de la y? et donc pour protèger au mieux mes variables de formulaire : je procède comme suit : pour tout les variables if(isset($_POST['SendEstimate'])){ $nom = mysql_real_escape_string(htmlentities($_POST['nom']));. etc, etc} j'avais aussi fais à l'époque des fonctions de se type pour les formulaire: function ValidPhone($phone){ $ctrl = '#^0[0-9]{1,3}[0-9]{6,7}$#'; if(preg_match($ctrl,$phone)){ return true; }else{ return false; }} un grand merci pour votre aide comme vous avez pu le constater suis un peu nul en securité Modifié 2 Octobre 2009 par bidibulle
SStephane Posté 2 Octobre 2009 Posté 2 Octobre 2009 Pas si tu fais ce que captain_torche t'a dit au niveau de tes includes. Cela dit rien ne l'empêche d'appeler y directement je me trompe ? htmlentities, c'est pour se prémunir du XSS. mysql_real_escape_string c'est pour une insertion dans une base de donnée. Si ton $_POST['nom'] sert dans l'entête de l'envoi de ton mail, vérifie qu'il n'y a pas de sauts de ligne (\r\n) d'une manière ou d'un autre, ce sera un bon début. Vérifie que l'email transmis est bien un email etc.
paolodelmare Posté 2 Octobre 2009 Posté 2 Octobre 2009 Il faut également jeter un oeil sur ton formulaire de contact pour éviter l'injection d'entête. Place éventuellement un patch (si ce n'est pas déjà fait ) du type mail-extra-header(pour avoir les IP dans le source du mail) et change tes accès SMTP (et tous les autres tant que t'y est). Configure php pour limiter les fonctions pernicieuses.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant