Aller au contenu

Protection des variables issues de formulaires ou de BDD


Sujets conseillés

Posté

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

Posté

Bonjour,

regarde du coté de htmlspecialchars(), htmlentities() et mysql_escape_string() sur php.net ;)

Posté (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 formulaire

function 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é par Pybou
Posté (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é par Occi
Posté (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é par Occi
Posté

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

Posté

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.

Posté

Pourquoi ne ferais-tu pas de htmlentities ?

Ce qui donnerai ça :

// Recupération des variables et protection
function 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 ?

Posté (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é par sparh
Posté (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é par pluriels
Posté

Merci pour ton lien :D 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 ...

Posté (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é par Occi
Posté

Super ^^ Merci je débute encore dans le PHP "avancé" donc merci beaucoup de votre aide je vous tiens au courant de la suite :)

  • 3 semaines plus tard...

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...