Comment enregistrez vous concrètement vos données en bd?

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


tryan
WRInaute accro
WRInaute accro
 
Messages: 1543
Inscription: Dim Fév 20, 2005 14:14

Comment enregistrez vous concrètement vos données en bd?

Message le Ven Sep 19, 2008 10:25

Bonjour,

Je patauge fréquemment dans le faite de pouvoir enregistrer en bd des données venant d'un formulaire tout en évitant les injections, les script à la con qui redirige vers un autre site, les slachs en trop, etc ..etc...

Supposons un simple champ texte:

Code: Tout sélectionner
<form  action="" method="post">
<input name="champ1" size="10" type="text">
<input name="Valider" value="Valider" type="submit">
</form>

Coté php:
Code: Tout sélectionner
<?php
//on verifie qu'il y a bien eu l'action de poster
if(isset($_POST["Valider"]))
{

// on vérifie si le champ est vide
if(empty($_POST["champ1"])){
echo 'blablab';
}
else
{
//on attribut une variable et on évite les injections
$lechamp2 = isset($_POST["champ1"]) ? mysql_real_escape_string($_POST["champ1"]) : '';

***Ici vous faites quoi pour éviter toutes les saloperie,script,. ..***

//on se connecte et  on insère les données en bd

include("data_bd.php");

mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier data_bd.php.');

$result = mysql_query(" INSERT INTO monchamp VALUES(
'',
'$lechamp2'
)");
mysql_close();
}
}
?>


Concrètement, comment faite vous pour que ce soit impeccable à l'insertion comme à l'affichage ?
Merci


SuperCureuil
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Ven Mar 09, 2007 9:44

Message le Ven Sep 19, 2008 10:49

Salut Tryan,

htmlentities ou htmlspecialchars ?!

Généralement ça suffit à neutraliser les éventuelles saloperies qu'un vicieux tenterait de faire passer. Du moins à mon niveau :wink:

@+

supercureuil


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 870
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Sep 19, 2008 10:52

j'utilise des framework qui implémente CRUD fini d'écrire les insert à la main copier coller le nom des champs ajouter mysql_real_escape_string...


siddhy
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 163
Inscription: Lun Sep 20, 2004 15:50

Message le Ven Sep 19, 2008 10:55

Salut,

J'utilise un framework maison avec PDO et htmlpurifier

comme julienr : "fini d'écrire les insert à la main copier coller le nom des champs ajouter mysql_real_escape_string"

:)


SuperCureuil
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Ven Mar 09, 2007 9:44

Message le Ven Sep 19, 2008 10:59

J'utilise un framework maison avec PDO et htmlpurifier

comme julienr : "fini d'écrire les insert à la main copier coller le nom des champs ajouter mysql_real_escape_string"


Je bénis le jour où j'en serai à ça :P


serval2a
WRInaute accro
WRInaute accro
 
Messages: 3453
Inscription: Lun Mar 21, 2005 18:17

Message le Ven Sep 19, 2008 11:16

Salut,
Pour moi ce sera pour les champs textes :
htmlentities()
strip_tags()
mysql_real_escape_string()
et vérification de la forme des adresses email s'il y a lieu (fonction récupérée de myphpannuaire).
Pour les images et les vidéos un paramétrage apache du serveur.


tryan
WRInaute accro
WRInaute accro
 
Messages: 1543
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 19, 2008 11:23

Merci de vos réponses :)
Donc si on fait:
Code: Tout sélectionner
//on attribut une variable
$lechamp2 = isset($_POST["champ1"]) ? htmlentities($_POST["champ1"]) : '';
//on supprime les balises HTML et PHP
$lechamp2 = strip_tags ($lechamp2);

//on évite les injections
$lechamp2 = mysql_real_escape_string($lechamp2);
....

avant enregistrement, c'est suffisant ?
Et en sortie pour l'affichage, on fait un html_entity_decode() sur chaque variable et rien de plus ?


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Ven Sep 19, 2008 11:36

J'utilise aussi un framework maison qui utilise PDO (d'ailleurs auparavant ce framework avait une classe qui faisait exactement la même chose via l'extension mysql).

Par contre je génère moi même les INSERT et autres requêtes, n'ayant absolument pas confiance dans les outils "automatisés" générant du SQL.

Donc "concrètement", ça donne chez moi :

Code: Tout sélectionner
$query = "insert into maTable ( champ1, champ2, champ3 )
          values ( :champ1, :champ2, :champ3 )";
$params = array(
        'champ1' => $variableA,
        'champ2' => $variableB,
        'champ3' => $variableC,
        );

$db->exec( $query, $params );


Donc pas de strip_tags, pas de htmlspecialchars ni htmlentities, pas de mysql_real_escape_string, pas de addslashes ni de stripslashes, etc.


Et en sortie pour l'affichage, on fait un html_entity_decode() sur chaque variable et rien de plus ?

Si je dis "n'importe quoi !", tu t'offusques ? :P
MySQL n'a absolument pas besoin qu'on lui colle du HTML dans le bec... encore moins si c'est pour le décoder à la sortie.
Le seul (petit) intérêt de faire du htmlspecialchars (ou htmlentities) lors de l'insertion, c'est pour des besoins de performance : ça évite de le faire sans arrêt à l'affichage. Mais ça a pas mal d'effets de bord pourris (chaines mal tronquées, occupation de plus de place, réutilisation des données plus complexe, etc).


tryan
WRInaute accro
WRInaute accro
 
Messages: 1543
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 19, 2008 12:08

Bool a écrit:Si je dis "n'importe quoi !", tu t'offusques ? :P

^^ nan, par contre j'ai déjà un peut de mal avec php de base alors quand on me parle de "framework maison qui utilise PDO", la j'ai mal au crane ^^!

Je préférerais rester sur du code php de "base" simple et fonctionnelle pour le moment .. du coup:
Code: Tout sélectionner
//on attribut une variable
$lechamp2 = isset($_POST["champ1"]) ? htmlentities($_POST["champ1"]) : '';
//on supprime les balises HTML et PHP
$lechamp2 = strip_tags ($lechamp2);

//on évite les injections
$lechamp2 = mysql_real_escape_string($lechamp2);
....

..c'est bon et suffisant ou pas ?
Merci


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Ven Sep 19, 2008 12:27

Pour moi à l'ancienne avec du PHP 4 ça donnerait plutôt : (sachant que le strip_tags est ici complètement facultatif)
Code: Tout sélectionner
// on attribut une variable
$lechamp2 = isset($_POST['champ1']) ? strip_tags( $_POST['champ1'] ) : '';

// on évite les injections
$lechamp2 = mysql_real_escape_string($lechamp2, $handleDeLaConnexion);



Et à l'affichage, uniquement pour du HTML, tu fais :
Code: Tout sélectionner
echo htmlspecialchars( $tonChamp );

ou selon le charset :
Code: Tout sélectionner
echo htmlentities( $tonChamp );



Pour ce qui est de l'utilisation de Framework ou non, tout dépend si le but est d'apprendre les rouages de PHP de A à Z ou bien de produire un site.
Le framework se charge d'éviter beaucoup de boulettes que tu pourrais faire par toi même, et te fait généralement gagner du temps sur la durée de développement.
De plus pour moi le développement grâce à un framework se doit d'être plus simple qu'un développement sans.


SuperCureuil
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Ven Mar 09, 2007 9:44

Message le Ven Sep 19, 2008 12:49

Pour ce qui est de l'utilisation de Framework ou non, tout dépend si le but est d'apprendre les rouages de PHP de A à Z ou bien de produire un site
.

Perso j'aimerais d'abord maîtriser le PHP de A à Z, même si je saute parfois certaines lettres ;). Pour l'instant, je code en procédural pour faire mes sites et quand je me sentirai prêt, je passerai à l'objet puis à l'utilisation d'un framework, avec les avantages que cela procure. Bref, chaque chose en son temps et dans l'ordre, de préférence :D

Merci, Bool, pour tes conseils avisés qui sont toujours de bons repères !


serval2a
WRInaute accro
WRInaute accro
 
Messages: 3453
Inscription: Lun Mar 21, 2005 18:17

Message le Ven Sep 19, 2008 12:52

@Bool : je suis d'accord mais généralement t'as beaucoup plus de fichiers susceptibles de te foutre la merde, tout dépend, selon moi, de l'utilité que tu en as.
De plus t'est toujours tributaire du développeur puisque le code n'est pas accessible.

@tryan : Pour les fonctions à utiliser du type de données qui doivent être traitées exemple à l'insertion et à la recherche tu n'utilises pas les mêmes, etc.
Si c'est pour ton annuaire effectivement le code de Bool est largement suffisant s'agissant de l'enregistrement des données (exemple soumission de site) et pour la page de recherche htmlentities() me semble tout indiqué à la récupération des variables.

@+


tryan
WRInaute accro
WRInaute accro
 
Messages: 1543
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 19, 2008 14:05

Bool a écrit:Pour ce qui est de l'utilisation de Framework ou non, tout dépend si le but est d'apprendre les rouages de PHP de A à Z ou bien de produire un site.

Les 2. Je veux avant tout produire un site et pour sa il me faut php . En gros "j'apprends" au fur et à mesure de mes besoins.

serval2a: Non ce n'est pas pour mon -www. Je construit un news site dont le formulaire comporte une cinquantaines de champs contenant soit des chiffres, soit des lettres, soit les 2 en même temps,soit des dates ... et le tout ouvert au public .. d'où mes questions sur la sécurité et méthode d'enregistrement en bd ^^, j'ai pas envie de me retrouver avec des pages qui ne fonctionne plus à cause de bout code à la con et autre :).

A la finale et si j'ai bien comprit, seul mysql_real_escape_string() est nécessaire avant l'enregistrement en bd.

Merci de vos réponses :D


serval2a
WRInaute accro
WRInaute accro
 
Messages: 3453
Inscription: Lun Mar 21, 2005 18:17

Message le Ven Sep 19, 2008 14:32

Bonjour,
Ce n'est suffisant que pour les failles d'injection SQL, pour les failles CSS t'as les autres notamment strip_tags (qui permet d'autoriser quelques bouts de code, une whitelist) ou encore htmlspecialchars, htmlentities, et l'astuce nl2br pour empêcher les injections mail, etc, etc.
Ou encore leurs frameworks tous prêts ^^.
Après si dans tes 50 champs t'as un champ d'upload faut encore empêcher l'upload de fichiers malveillants (ça c'est le pire, amha).
@+


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 870
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Sep 19, 2008 14:49

siddhy a écrit:htmlpurifier

Comment enregistrez vous concrètement vos données en bd?

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

  • Analyse de positionnement sur les data centers de Google
    Cet outil vous permet d'afficher sur une seule page les résultats Google effectués sur de nombreux data centers (centres de données).
  • Calculer l'indice de co-occurrence
    Cet outil vous permet de calculer l'indice de co-occurrence de 2 ou 3 termes, ainsi que le ratio E/F. L'indice de co-occurrence mesure le relation entre les termes : plus cet indice est élevé, plus les termes sont reliés. Concrètement, plus l'indice est élevé, plus il est fréquent de trouver des documents qui contiennent les différents termes.


Qui est en ligne

Utilisateurs parcourant ce forum: ortolojf et 2 invités