test de securité

Mammouth du PHP | 620 Messages

11 juil. 2010, 15:05

Bonjour,
je voudrai testé un champ d'un de mes formulaire qui envoi des données vers ma base de données. J'affiche ensuite le contenu de ma base sur mon site.
quelle code puis-je essayé de mettre dans mon champs pour voir si je ne risque pas d'avoir de surprise de piratage ou autre (javascript, injection sql...)
Merci de vos exemples.

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 15:42

Les premiers éléments sont ici

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 620 Messages

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(); 
        ?> 


ViPHP
AB
ViPHP | 5818 Messages

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']);

Eléphanteau du PHP | 30 Messages

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.
PHP, Javascript, VBScript, Java, Python, Ruby, 4D, LotusScript, ObjectivC, C, C++, et sans compter les framework...
Qui a dit que les programmeurs n'avaient pas d'amis ?

Mon blog : http://www.programmeur.ch/blog/

Mammouth du PHP | 620 Messages

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 ?

ViPHP
AB
ViPHP | 5818 Messages

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é)

Eléphanteau du PHP | 30 Messages

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.
PHP, Javascript, VBScript, Java, Python, Ruby, 4D, LotusScript, ObjectivC, C, C++, et sans compter les framework...
Qui a dit que les programmeurs n'avaient pas d'amis ?

Mon blog : http://www.programmeur.ch/blog/

Eléphanteau du PHP | 30 Messages

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.
PHP, Javascript, VBScript, Java, Python, Ruby, 4D, LotusScript, ObjectivC, C, C++, et sans compter les framework...
Qui a dit que les programmeurs n'avaient pas d'amis ?

Mon blog : http://www.programmeur.ch/blog/

ViPHP
AB
ViPHP | 5818 Messages

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.

Mammouth du PHP | 620 Messages

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.

Eléphanteau du PHP | 30 Messages

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.
PHP, Javascript, VBScript, Java, Python, Ruby, 4D, LotusScript, ObjectivC, C, C++, et sans compter les framework...
Qui a dit que les programmeurs n'avaient pas d'amis ?

Mon blog : http://www.programmeur.ch/blog/

ViPHP
AB
ViPHP | 5818 Messages

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ù ?

Mammouth du PHP | 620 Messages

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.
Modifié en dernier par fabrice88250 le 11 juil. 2010, 20:37, modifié 1 fois.