IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

insertion des caracteres : ’ et ‘ dans la bd


Sujet :

Servlets/JSP Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut insertion des caracteres : ’ et ‘ dans la bd
    Bonjour,

    j'ai dans ma servlet une requête SQL "insert into" pour enregister des données dans une table d'une base de données mysql.

    tous les caractères spéciaux s'enregistrent bien : é, è, à, ' et " (j'ai programmé une methode comme addslashes de php pour remplacer ' par \' et " par \", et ça marche bien).

    sauf les deux caractères : et , ils sont remplacé dans la bd par : ?

    j'ai essayé la même requête en php pour la même table de la même bd et ça marche bien, il n y a aucun probleme avec ces deux caracteres, alors je suppose que le probleme est en java et pas en mysql

    il y a quelque'un qui peut m'aider ?

    (j'utilise eclipse, tomcat 6.0 et mysql 4 sous windows xp)

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    bon d'abord les truc à la addslashes on évite, c'est source de sql injection, on préfère les prépared statements qui sont bien plus correct.

    Ensuite, pour ton caractère, il faut voir à quel niveau il est mangé.

    Ca peut etre lors du transfert client web -> servlet (peu probable si les é è marchent)
    Ca peut etre un mauvais encodage etre ton driver jdbc et ton serveur sql (toujour si possible, préférer l'utf-8 des deux coté)
    Ca peut la table en question qui a été stockée avec un encodage ne reconnaissant pas ces caractère particulier.

    Vu ta descrition, c'est probablement le deuxième cas. Essaie de mettre une "characterEncoding=utf-8" dans ton url jdbc

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    problème résolu grâce à toi tchize.

    j'avais l'encodage latin1 (iso-8859-1) dans ma bd, alors ça marche par php et ça marche pas par java, même lorsque j'ai met characterEncoding=utf8 dans l'url de jdbc.

    alors j'ai dù changer les deux :
    1. créer la base avec l'interclassement et le jeu de caractères UTF8 : CREATE DATABASE nombd CHARACTER SET utf8 COLLATE utf8_general_ci

    2. ajouter l'encodage dans l'url jdbc :
    jdbc:mysql://hostname:port/database?autoReconnect=true&useUnicode=true&characterEncoding=utf8

    tu peux m'expliquer un peu comment addslashes laisse des failles sql injection ? et comment je dois les corriger avec prépared statements, parce que j'utilise toujours addslashes pour sécuriser cette vulnérabilité.

    Merci beaucoup Tchize.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    étonnant que çà aie passé en php, il a probablement du faire une correction, car les charset ISO-8859-1 ne contient simplement pas les deux caractère mentionné. Il y a bien des ' et `, mais pas de ’ ni de ‘ http://fr.wikipedia.org/wiki/ISO_885....A0_ISO-8859-1

    Pour le addslashes, le problème c'est qu'il "slashe" des caractères considérés comme dangereux dans les database sql. Hors, de mémoire, on a eu un trou monumental de sécurité à un moment donné avec cette fonction. Quand on a découvert que le guillemet inversé (ou qqch de similaire) pouvait aussi être utilisé comme séparateur avec msql et que addslashes ne le connaissait pas.

    Disons en gros que çà requiert
    1) que ta fonction addslashes que t'as codé fonctionne correctement dans TOUS les cas de figure (comme c'est un parsing partant de présupposés, c'est déjà un gros risque)
    2) que le set de caractères dit dangereux soit connu entièrement
    3) que le programmeur n'oublie pas par mégarde un appel sur un des paramètres (une distraction çà arrive).

    Un prepared statement, au contraire, n'as pas ces risques, puisqu'on passe les paramètres à part de la requete. Ils sont donc complètement isolé dès le départ et sans traitement particulier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEE SET SALARY = ? WHERE ID = ?");
       pstmt.setBigDecimal(1, 153833.00)
       pstmt.setInt(2, 110592)
    Note que tu as aussi l'avantage que les variable sont typées. Par exemple, si tu doit jouer avec un date, tu fais un setDate(index,valeur) et t'as pas à te soucier de la représentation interne à la db, tu passe simplement un java.sql.Date.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    voila ma solution, je vais transformer ma fonction addslashes à mysql_real_escape_string, par ajouter un slash aux tous les caractères spéciaux de mysql : NULL, \x00, \n, \r, \, ', " et \x1a.

    Tu pense que c'est suffisant ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    personnellement, je trouve les prepared statements plus facile à lire, plus facile à écrire et plus sécurisant. Maintenant, question de choix personnel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec des caractères spéciaux dans une chaine
    Par thibaut06 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/11/2006, 16h46
  2. Réponses: 1
    Dernier message: 11/09/2006, 09h21
  3. [FileWriter] insertion des résultats null dans le fichier plat
    Par Pakkaï dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/08/2006, 11h06
  4. Réponses: 2
    Dernier message: 05/06/2006, 14h24
  5. Réponses: 3
    Dernier message: 24/04/2006, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo