test de securité

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : test de securité

Re: test de securité

par Stef » 15 juil. 2010, 20:35

Dans un cas comme ça, à mes yeux la seule solution c'est de délimiter "manuellement" les balises autorisées, avec strip_tags... Même si ça peut être fastidieux, au moins t'as le contrôle de ce qui peut être exécuté ou pas.

Re: test de securité

par AB » 11 juil. 2010, 20:27

Bah c'est normal puisque htmlentities te permet d'afficher le code qui se trouve en bdd sans l'interpréter.
Avec TinyMCE je ne peux pas te dire comment protéger tes données car je ne l'utilise pas (j'utilise le même système de balises que dans ce forum).
Regardes vers les liens que t'a donné loboblahz. Comme j'ai posté presqu'en même temps que lui je n'ai pas eu le temps de regarder son précédent message.

Re: test de securité

par fabrice88250 » 11 juil. 2010, 20:01

ici par exemple :
<?PHP echo htmlentities($result['description']); ?>
du coup au lieu d'avoir par exemple :
la couleur bleu
j'ai :
la couleur <span style="color: #ff6600;">bleu</span>

du coup je ne met pas htmlentities car je viens de faire des essais en ajoutant dans mon champ description (comme si j'etai un iternaute) :
<SCRIPT language="Javascript">

<!--
alert("Voici un message d\'alerte!");

// -->

</SCRIPT>
et j'ai le code qui s'affiche et le script ne s'execute pas.

Re: test de securité

par AB » 11 juil. 2010, 19:49

bon alors comme mon champ description est lié a un editeur wyswyg (tinymce) si je met un htmlentities() j'ai tout le code qui apparait.
Si mets htmlentities() où ?

Re: test de securité

par loboblahz » 11 juil. 2010, 19:48

bon alors comme mon champ description est lié a un editeur wyswyg (tinymce) si je met un htmlentities() j'ai tout le code qui apparait.
si je comprend bien il n'y a donc pas moyen de protéger le champ description afin d'evité que certaine personnes ajoute des script ou autre qui poluraient mon site.
Pour les éditeurs WYSWYG tu as ceci : http://www.bioinformatics.org/phplabwar ... YSIWYG.htm
Tu as une méthode fournie par moxiecode (TinyMCE) d'ailleurs expliquée ici (en anglais) http://wiki.moxiecode.com/index.php/TinyMCE:Security

Dans tous les cas, mysql_real_escape_string est obligatoire.

Re: test de securité

par fabrice88250 » 11 juil. 2010, 19:36

bon alors comme mon champ description est lié a un editeur wyswyg (tinymce) si je met un htmlentities() j'ai tout le code qui apparait.
si je comprend bien il n'y a donc pas moyen de protéger le champ description afin d'evité que certaine personnes ajoute des script ou autre qui poluraient mon site.

Re: test de securité

par AB » 11 juil. 2010, 19:26

Je te dirai d'ajouter strip_tags
Ben non car comment ferait-on pour afficher des extraits de code comme par exemple dans ce forum ?

C'est l'affichage que l'on protège avec htmlentities ou htmlspecialchars (et éventuellement strip_tags dans des circonstances particulières), mais la bdd doit être en mesure d'enregistrer tous les caractères.
Dans le cas présent, je doute qu'il s'agisse d'un forum où l'on soumette du code. Il suffit de voir le nom des champs utilisés. "Titre" et "Description", peut importe ce que cela décrit, mais je ne penses pas qu'on souhaite se retrouver avec des tags HTML polluant le titre et la description (corriges moi fabrice si jamais). A moins bien sur qu'il utilise un éditeur en JS du genre CKEditor ou TinyMCE.

En plus d'une sécurité c'est un bon nettoyage. Rien n'empêche d'ajouter html_entities après le strip_tags pour obtenir un affichage correct du contenu de ces champs dans une page avec un bon encodage des caractères spéciaux et que le W3C soit fier de vous.

Et en général, il est préférable d'éviter de faire un htmlentities pour le stockage si on ne veut pas de code HTML, car cela est assez embêtant lorsque l'on fait une sortie des données vers un fichier CSV par exemple. On est obligé de se farcir un script maison au lieu d'utiliser un simple client MySQL ou PostgreSQL. Son utilisation lors de la génération de la page HTML suffit.
Mais ce que tu dis pour htmlentities est également valable pour strip_tags .... Son utilisation lors de la génération de la page HTML suffit.

Pourquoi vouloir limiter les caractères en entrée dans la base quand on peut les limiter en sortie à l'affichage selon les besoins ?

Ta méthode "castratrice" ne peut pas être conseillée d'une manière générale.

Re: test de securité

par loboblahz » 11 juil. 2010, 19:01

OK MERCI.

Maintenant striptags() ou htmlentities().
si j'utilise un editeur wyswyg comme tinymce celà ne risque t'il pas de poser probleme ?
si sur mon champ
<textarea name="description" rows="10" id="description"></textarea>
j'utilise tinymce est ce qu'a l'affichage je ne risque pas d'avoir par exemple le code qui s'affiche au lieu de la mise en page qui aura été faite avec tinymce ?
Mon message c'est croisé avec le tien, en effet dans ce cas, il y aura un problème avec strip_tags. C'est sûr.

Re: test de securité

par loboblahz » 11 juil. 2010, 18:54

Je te dirai d'ajouter strip_tags
Ben non car comment ferait-on pour afficher des extraits de code comme par exemple dans ce forum ?

C'est l'affichage que l'on protège avec htmlentities ou htmlspecialchars (et éventuellement strip_tags dans des circonstances particulières), mais la bdd doit être en mesure d'enregistrer tous les caractères.
Dans le cas présent, je doute qu'il s'agisse d'un forum où l'on soumette du code. Il suffit de voir le nom des champs utilisés. "Titre" et "Description", peut importe ce que cela décrit, mais je ne penses pas qu'on souhaite se retrouver avec des tags HTML polluant le titre et la description (corriges moi fabrice si jamais). A moins bien sur qu'il utilise un éditeur en JS du genre CKEditor ou TinyMCE.

En plus d'une sécurité c'est un bon nettoyage. Rien n'empêche d'ajouter html_entities après le strip_tags pour obtenir un affichage correct du contenu de ces champs dans une page avec un bon encodage des caractères spéciaux et que le W3C soit fier de vous.

Et en général, il est préférable d'éviter de faire un htmlentities pour le stockage si on ne veut pas de code HTML, car cela est assez embêtant lorsque l'on fait une sortie des données vers un fichier CSV par exemple. On est obligé de se farcir un script maison au lieu d'utiliser un simple client MySQL ou PostgreSQL. Son utilisation lors de la génération de la page HTML suffit.

Re: test de securité

par AB » 11 juil. 2010, 18:21

Je te dirai d'ajouter strip_tags
Ben non car comment ferait-on pour afficher des extraits de code comme par exemple dans ce forum ?

C'est l'affichage que l'on protège avec htmlentities ou htmlspecialchars (et éventuellement strip_tags dans des circonstances particulières), mais la bdd doit être en mesure d'enregistrer tous les caractères.

@fabrice88250 à part ça tu as avancé dans ton upload ? (réponds dans le topic approprié)

Re: test de securité

par fabrice88250 » 11 juil. 2010, 18:16

OK MERCI.

Maintenant striptags() ou htmlentities().
si j'utilise un editeur wyswyg comme tinymce celà ne risque t'il pas de poser probleme ?
si sur mon champ
<textarea name="description" rows="10" id="description"></textarea>
j'utilise tinymce est ce qu'a l'affichage je ne risque pas d'avoir par exemple le code qui s'affiche au lieu de la mise en page qui aura été faite avec tinymce ?

Re: test de securité

par loboblahz » 11 juil. 2010, 18:06

Ben mysql_real_escape_string est une fonction...
Je te dirai d'ajouter strip_tags avant ça donne pour ton code :
  <?PHP
        include("../connexion-sql.php");
        $titre =mysql_real_escape_string(strip_tags( $_POST['titre']));
        $description = mysql_real_escape_string(strip_tags($_POST['description']));
           
        $sql = "INSERT INTO IWantenne(id, titre, description) VALUES('','$titre','$description'')"; mysql_query($sql) or die('Erreur SQL !'.$sql.' '.mysql_error());
        //si les données son biens enregistrées dans la base :
        echo 'L\'info a bien été enregistrée.';
        mysql_close();
        ?> 
En affectant ton $_POST['titre'] et $_POST['description'] sous cette forme tu fais un nettoyage des tags HTML dans ce que l'on t'envoi via le formulaire et ensuite tu protége tes valeurs pour l'envoi à la base de données.

Re: test de securité

par AB » 11 juil. 2010, 18:01

[quote="fabrice88250"]
comme ça ?
        <?PHP
        include("../connexion-sql.php");

        $titre = $_POST['titre'];
        $description = $_POST['description'];
mysql_real_escape_string($titre ));
mysql_real_escape_string($description ));
           
 
non comme ça :
 $titre = mysql_real_escape_string($_POST['titre']);

Re: test de securité

par fabrice88250 » 11 juil. 2010, 17:55

ok alors commencons par mysql_real_escape_string() .

par exemple j'ai un formulaire :
<form action="validation-reponse.php" method="post">
<input name="titre" type="text" id="titre" />
<textarea name="description" rows="10" id="description"></textarea>
<input name="submit" type="submit" value="Valider" />
</form>
qui envoie les données dans ma base :
        <?PHP
        include("../connexion-sql.php");
        $titre = $_POST['titre'];
        $description = $_POST['description'];
            
        $sql = "INSERT INTO IWantenne(id, titre, description) VALUES('','$titre','$description'')"; mysql_query($sql) or die('Erreur SQL !'.$sql.' '.mysql_error()); 
        //si les données son biens enregistrées dans la base :
        echo 'L\'info a bien été enregistrée.'; 
        mysql_close(); 
        ?> 
Comment j'intégre le mysql_real_escape_string() sachant que dans ce cas je n'ai que 2 infos mais je peu en avoir une quinzaine ?
comme ça ?
        <?PHP
        include("../connexion-sql.php");

        $titre = $_POST['titre'];
        $description = $_POST['description'];
mysql_real_escape_string($titre ));
mysql_real_escape_string($description ));
           
        $sql = "INSERT INTO IWantenne(id, titre, description) VALUES('','$titre','$description'')"; mysql_query($sql) or die('Erreur SQL !'.$sql.' '.mysql_error()); 
        //si les données son biens enregistrées dans la base :
        echo 'L\'info a bien été enregistrée.'; 
        mysql_close(); 
        ?> 

Re: test de securité

par Ryle » 11 juil. 2010, 15:44

Tu peux utiliser mysql_real_escape_string() pour éviter les injections, et striptags() ou htmlentities() pour bloquer le html/js...

tu peux également vérifier la taille ou le format de la chaine par rapport à ce que tu attends en base :)