8795 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je vais probablement poser une question qui a déjà été posée maintes et maintes fois mais après plusieurs jours de recherches et de lecture de différents postes je reste confus et incertain.

Ma question est donc :
J'aimerais savoir si le code que j'utilise pour injecter mes données, en provenance d'un formulaire, en DB et ensuite l'affichage de celles ci dans mon livre d'or est sécurisé contre les attaques.
Lorsque je reçois mes données, du formulaire, et juste avant l'injection en db, je fais :

$champ = !empty($_POST['champ']) ? trim($_POST['champ']) : '';
$champ = mysql_real_escape_string($champ);

Ensuite lorsque je veux afficher mes données récupérées de la db, je fais :

$champ = nl2br(htmlspecialchars(stripslashes($data['champ'])));


Pour info, magic_quotes est actif d'où le stripslashes.
Je m'en réfère à vous car j'ai déjà essayé tellement de choses différentes et qui fonctionnent que je ne sais pas ce qui est le plus sur et le plus conseillé.

Merci d'avance pour votre aide et bonne journée.

Kevin
Modifié par kevinAsh (15 Nov 2009 - 20:17)
Merci Benjamin-Ds, l'article que tu cites est vraiment bien, je viens de le lire et il est très clair.

PS: Pour corriger mon code, si je suis le tuto que tu m'as transmis, je dois utiliser htmlentities() à la place de htmlspecialchars().

Bonne soirée.

Kevin
Modérateur
Hello,

moust a écrit :
magic_quotes c'est le mal, désactives ça par défaut dans ta configuration de PHP Smiley langue


+1
Dans le cas où tu ne sais pas si ton code sera dans une config avec ou sans magic_quotes, je te propose de lire ceci :

function normalisation(){
    if(get_magic_quotes_gpc()){
        $_POST = array_map("stripslashes",$_POST);
        $_GET = array_map("stripslashes",$_GET);
        $_REQUEST = array_map("stripslashes",$_REQUEST);
        $_COOKIE = array_map("stripslashes",$_COOKIE);
    }
}
normalisation();


Perso, j'utilise htmlentities() par habitude surement. Comme le dit bien notre ami Heyoan htmlspecialchars() suffit amplement.

Également, je peux te conseiller d'utiliser un masque de données lorsque tu dois faire une requête de mise à jour ou d'insertion dans ta base. Ce masque, tu peux le faire via sprintf().

Pour finir, il est préférable de nettoyer tes données avant l'envoi en bdd. Apparemment, ce n'est pas le cas.

bon code
Modifié par Nolem (16 Nov 2009 - 05:30)
Salut,

Nolem a écrit :
Pour finir, il est préférable de nettoyer tes données avant l'envoi en bdd. Apparemment, ce n'est pas le cas.
Apparemment c'est le cas avec mysql_real_escape_string. Smiley cligne

D'autre part il vaut mieux désactiver délibérément les guillemets magiques (avec ini_set si le php.ini n'est pas disponible) plutôt que de rajouter une surcouche dans le code.