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

WRInaute passionné
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:
<form  action="" method="post">
<input name="champ1" size="10" type="text">
<input name="Valider" value="Valider" type="submit">
</form>
Coté php:
Code:
<?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
 
WRInaute impliqué
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...
 
WRInaute discret
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"

:)
 
WRInaute accro
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.
 
WRInaute passionné
Merci de vos réponses :)
Donc si on fait:
Code:
//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 ?
 
WRInaute passionné
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:
$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).
 
WRInaute passionné
Bool a dit:
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:
//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
 
WRInaute passionné
Pour moi à l'ancienne avec du PHP 4 ça donnerait plutôt : (sachant que le strip_tags est ici complètement facultatif)
Code:
// 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:
echo htmlspecialchars( $tonChamp );
ou selon le charset :
Code:
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.
 
WRInaute impliqué
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 !
 
WRInaute accro
@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.

@+
 
WRInaute passionné
Bool a dit:
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
 
WRInaute accro
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).
@+
 
WRInaute passionné
Je reviens à la charge ^^ .

Bon, pour le moment on oublie les framework maison avec PDO et htmlpurifier ... on en reste au simple php de base.

Après plusieurs teste, un mysql_real_escape_string() sur un champ texte avant insertion en bd et un htmlspecialchars en sortie semble suffisant contre les injections et script à la noix ... ou vous me conseiller autre chose ?
 
WRInaute passionné
Disons qu'il faut remettre chaque chose à sa place :
- pour protéger MySQL des injections, mysql_real_escape_string suffit généralement. Mais mal utilisé, ça ne changera rien.
- pour protéger la page HTML, htmlspecialchars suffit également.

Mais ça ne fait que ça... il y a d'autres types de failles ("XSS" par exemple).
 
WRInaute passionné
Oki, merci Bool :D .

Outre les autres failles en tout genre, ce que je voulais savoir, c'est comment enregistrer mes données correctement en bd surtout quand c'est le "visiteur" qui entre les données ^^.
 
WRInaute discret
je reviens à la charge xD

Pas besoin d'avoir un framework maison pour utiliser htmlpurifier. Tu peux tres facilement l'inclure et t'en servir dans ton "simple php de base" :) et "surtout quand c'est le "visiteur" qui entre les données"
 
Discussions similaires
Haut