PDA

Afficher la version complète : Sécuriser mon site



belphegor
24/04/2008, 16h03
Bonjour,

Pour rappel, je me suis amusé à développer un site : http://belphegor.phantom.free.fr/blog et j'aimerais le sécuriser contre les attaques des pirates.

A ma connaissance, il y a les injections de code SQL, et les injections de code Java Script.

J'ai recherché un peu sur le web et j'ai trouvé plusieurs solutions :
- striptags
- mysql_real_escape_string
- addslashes
- htmlspecialchars

Mais je ne sais pas laquelle utiliser.
Pour l'instant je me contente de mysql_real_escape_string et striptags, mais est-ce une choix judicieux ?

Si vous pouviez m'aider, y a tellement de cons sur Terre que je préfère avoir pris mes précautions, même si je sais que mon site sera visité par 10 personnes maximum. Je veux enrichir mes connaissances, et être un bon programmeur!

Merci beaucoup pour ces explications et bonne fin de journée!!

Heero_Yuy
24/04/2008, 16h06
Ca m'intéresse aussi, car je vais certainement me lancer également dans le développement d'un site Web style Blog pour mettre à disposition mes différents programmes.

Autant se renseigner avant ;)

salv-ice
24/04/2008, 17h06
Salut !

Personnellement, j'utilise "htmlspecialchars" avant d'interroger ma base de données, ce qui évite les injections SQL et "htmlentities", plus complet, avant d'afficher quoi que ce soit venant de ma base de données. htmlentities à une double fonction : éviter les problèmes de charset en modifiant les caractères spéciaux et éviter l'exécution de code javascript qui serai présent dans ta BDD.

Sinon, il faut absolument éviter de passer des données sensibles par $_GET et bien les vérifier systématiquement même si elles ne sont pas importantes!

Voilà, j'estime que pour un site perso c'est déjà bien suffisant... ;)

xiloa
24/04/2008, 17h08
Pour rappel, je me suis amusé à développer un site : http://belphegor.phatom.free.fr/blog et j'aimerais le sécuriser contre les attaques des pirates.[/b]

salut,

ben à mon avis c'est trop tard, le site ne marche pas :blink:

belphegor
24/04/2008, 21h46
Bonsoir,

Salv-ice > Tu les utilises quand les deux htmtspeacialchars et htmlentities ? A quelle moment ?

Xiloa > petite erreur de lien :) http://belphegor.phantom.free.fr/blog

salv-ice
25/04/2008, 07h42
<div class='quotetop'>Citation </div>
Salv-ice > Tu les utilises quand les deux htmtspeacialchars et htmlentities ? A quelle moment ?[/b]

Comme je l'ai dit plus haut, j'utilise "htmlspecialchars" juste avant d'envoyer une requete à ma base de données.
Par exemple, j'ai un champ texte dans un formulaire qui s'appelle "message", avant de faire ma requete, je fais :


$message = htmlspecialchars($_POST['message']);
$requete = 'INSERT INTO ... ... '.$message.'... ...';

Pour "htmlentities", je l'utilise juste après une requete SELECT, lorsque je dois afficher des données venant de ma BDD, donc :


REQUETE SELECT MESSAGE...;
$echo htmlentities($message);

devloop
25/04/2008, 08h18
tu devrais utiliser mysql_real_escape_string au lieu de htmlspecialchars pour modifier les données avant insertion dans la base de données car :
* ce n'est pas le role de htmlspecialchars alors que mysql_real_escape_string a été concu spécifiquement dans cette optique
* htmlspecialchars ne filtre pas par défaut les simples quotes
* htmlspecialchars va augmenter inutilement la taille des données dans ta base de données

ensuite tu fais un htmlentities lors de l'extraction des données alors qu'elles ont déjà été converties une première fois par htmlspecialchars avant insertion dans la base

ce qui voudrait dire que si tu as une double quote dans tes données :
* elle sera transformée en &quot; lors de l'insertion dans la base
* elle sera transformée en &amp;quot; lors de l'affichage :huh:

sinon l'utilisation de mysql_real_escape_string dépend de la valeur retournée par get_magic_quotes_gpc qui permet de savoir si les chaines sont "échappées" automatiquement ou non.

http://www.manuelphp.com/php/function.get-...-quotes-gpc.php (http://www.manuelphp.com/php/function.get-magic-quotes-gpc.php)

salv-ice
25/04/2008, 08h47
Merci beaucoup devloop, je ne connaissais pas cette fonction ! ;)

belphegor
27/04/2008, 18h14
Salut,

J'ai essayé mysql_real_escapte_string mais j'ai des problêmes avec.

Si je mets ça dans le message :

<script>alert("bonjour")</script>
belphegor (belphegor.html)
<table>
Ca ne marche pas car il met des \ devant les guillemets. C'est très bien, ça bloque le javascript et empêcher de bousiller l'interface à cause de la non-fermeture de la balise table, mais ça bloque aussi le lien et ça c'est moins bien.
Je pourrais ajouter stripslashes, mais là le javascript est réactivé.

Quelle est la solution?

Striptags, bien parce que je peux lui demander de ne pas filtrer certaines balises, mais :
<div class='quotetop'>Citation </div>
Note: allowable_tags a été ajouté en PHP 3.0.13 et PHP 4.0.0.
Depuis PHP 4.3.0, les commentaires HTML sont aussi supprimés. Ce comportement est inclus en interne et ne peut pas être modifié avec le paramètre allowable_tags .

Avertissement

Comme strip_tags() ne valide actuellement pas le HTML, les balises partielles ou rompues peuvent conduire à la suppression de plus de textes/données que désiré.
Avertissement

strip_tags() ne modifie pas les attributs des balises que vous autorisez via le paramètre allowable_tags , y compris les attributs style et onmouseover, que des utilisateurs mal intentionnés peuvent utiliser.[/b]

J'aimerais trouver le bon compromis, si vous voyez ce que je veux dire!

devloop
28/04/2008, 08h23
pourquoi ne pas utiliser un htmlentities sur les données à afficher ?

Kiwi
26/05/2008, 14h39
Préférer faire ainsi:

htmlstripslash(htmlentities(htmlspecialchars($_POS T['plop'])));

avec un peu de error_repporting, et l'utilisation de mysql_real_escape_string, vous devrez être un minimum sécurisé (contre les script kiddies en tout cas).


conseil: Ne faites pas confiance au safe_mod();
conseil: lire: http://www.php.net/manual/fr/security.php

Meilleures salutation;