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

PHP & Base de données Discussion :

Sécuriser une transaction


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut Sécuriser une transaction
    Bonjour,

    Je voudrais quelques renseignements sur la sécurité des transactions. Prenons un exemple simple: plusieurs personnes ont accès à la même page, et peuvent placer des employés sur une carte google map. Ce faisant, la latitude et la longitude de ces employés se note dans une base de données que nous appelerons "EMPLOYESLOC".
    Ce que je voudrais savoir, c'est comment gérer les accès concurrents, si plusieurs personnes tentent de placer le même employé en même temps...
    Comment bloquer cela ?
    J'ai entendu vaguement parler de commit et rollback mais je ne sais pas si cela convient.

    Pouvez-vous m'éclairer ? Merci!

  2. #2
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Bonjour,

    Definition de commit:
    La commande Commit, représente la validation d'une transaction.

    Sur certains moteur de base de donnée il est possible de lancer des requêtes, modifications, insertions, etc. et le valider ou non ces modifications.

    Pour te cas je pencherai plutôt sur l'utilisation d'AJAX en Javascript/PHP afin d'aller tester en direct si cet employé à été déjà mis à jour ou non.
    Si ce n'est pas le cas, tu l'ajoute, la encore en direct et le prochain qui tentera l'ajout se verra refuser l'insertion pour cause d'employé déjà existant.

    A toi de faire l'algorithme qui définit ton "en même temps".

    En espérant t'avoir un peu aidé.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut
    Bonjour,

    Merci pour ces explications. C'est justement de faire cet algorithme qui me pose problème, je ne vois pas du tout comment commencer...

  4. #4
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    A la validation de ton formulaire, tu va lancer une fonction javascript.

    La démarche de AJAX est simple, cette fonction JavaScript à le pouvoir d'aller consulter une page php et d'en retourner le résultat.

    Tu aura donc:

    - Ta page formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form action="..." method="..." onSubmit="return checkDispo('id_employe');">
    <input type="hidden" name="id_employe" id="id_employe" value="IDENTIFIANT DE TON EMPLOYE" />
    //bla bla bla
    </form>
    - La fonction JavaScript
    http://siddh.developpez.com/articles/ajax/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <script type='text/JavaScript'>
     
    	 		function getXhr(){
                                    var xhr = null; 
    				if(window.XMLHttpRequest) // Firefox et autres
    				   xhr = new XMLHttpRequest(); 
    				else if(window.ActiveXObject){ // Internet Explorer 
    				   try {
    			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			            } catch (e) {
    			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			            }
    				}
    				else { // XMLHttpRequest non supporté par le navigateur 
    				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    				   xhr = false; 
    				} 
                                    return xhr
    			}
     
    			/**
    			* Méthode qui sera appelée sur la validation du formulaire
    			*/
    			function checkDispo(id){
                                    var id_employe = document.getElementById(id).value;
     
    				var xhr = getXhr()
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						if(xhr.responseText == 0) {
                                                      alert("L'employé à déjà été placé.");
                                                      return false;
                                                    } else
                                                      return true;
    					}
    				}
    				xhr.open("GET","testDispo.php?id_employe="+id_employe,true);
    				xhr.send(null);
    			}
    		</script>
    - Une page qui retournera par exemple 0 si on peut placer l'employé et 1 sinon (testDispo.php)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    //connection base de donnée
    //requête de recherche si ton employé a déjà été placé
    //on dispose de son identifiant avec $_GET['id_employe'] ou $_REQUEST['id_employe']
    //Suivant la réponse tu fait un echo '0'; ou echo '1';
    ?>
    Ces codes ne sont pas testés, mais cherche validation de formulaire en ajax, tu trouvera des exemples complets par exemple sur la vérification d'un pseudo, disponible ou pas, etc.

    Tiens moi au jus!

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par Relyss
    Ce que je voudrais savoir, c'est comment gérer les accès concurrents, si plusieurs personnes tentent de placer le même employé en même temps...
    Comment bloquer cela ?
    J'ai entendu vaguement parler de commit et rollback mais je ne sais pas si cela convient.
    Les commit rollback effectivement sont fait pour éviter des accés concurents (mais pas seulement), mais comme une requête s'exécute en quelques millièmes de secondes, faut y aller franchement fort avant d'estimer qu'il y aura concurence.

    A part des secteurs comme les banques, billets d'avions/trains, etc ... qui couvrent une zone national voir international, là il est susceptible d'avoir accès concurrents.

    Puis si le but est d'éviter d'avoir des doublons, en faisant une simple requête SQL avant insertion pour vérifier une certaine concordance entre les données qu'une personne tenterait d'enregistrer et ce qui existe dans la Bdd ne suffirait il pas ?
    - Si la requête renvoie un résultat, on refuse et on renvoie un message comme quoi que enregistrement existe déjà.
    - Sinon, en enregistre.
    Ici, c'est très courant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut
    Merci beaucoup firehist et RunCodePhp pour vos réponses.
    J'avoue que je commence à beaucoup mieux cerner le problème !
    Je vais potasser le lien également.
    Donc je récapitule si j'ai bien compris:

    On créée l'objet XLMHttpRequest, puis lorsque le formulaire est soumis, on appelle une fonction javascript, qui va regarder la réponse renvoyée par la page php qu'on aura appelée également dans la fonction "checkDispo".
    Maintenant j'ai deux trois questions (et oui, encore !)
    -Pourquoi fait-on le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xhr.open("GET","testDispo.php?id_employe="+id_employe,true);
    				xhr.send(null);
    à la fin de la fonction, et ce après avoir analysé responseText ?

    -Que faire dans le cas où on n'a pas de formulaire, et donc pas de méthode submit, pour appeler la fonction checkDispo ?
    (Si par exemple le visiteur veut sélectionner l'employé dans une liste ?)

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    -Que faire dans le cas où on n'a pas de formulaire, et donc pas de méthode submit, pour appeler la fonction checkDispo ?
    (Si par exemple le visiteur veut sélectionner l'employé dans une liste ?)
    Si un visiteur a une liste d'employés sous les yeux, c'est qu'ils sont déjà enregistrés, non ?
    Dans ce cas là il ne faut pas proposer de les enregistrer.

    Mais si c'est une liste quelque peu aléatoire, mélangé, il y a peut être moyen de faire une vérif en boucle, de telle façon le visiteur saura à l'avance si tel ou tel employé est dispo ou non, de proposer une colonne "Dispo" avec un symbole le signifiant par exemple.
    Plus besoin d'Ajax dans ce cas là.
    Pure hypothèse ici.


    A coté de ça, Ajax c'est avant tout du JS, et pour déclencher du JS ça se fait par un onclick="checkDispo(id_employe);" sur un lien par exemple, au même titre qu'un alert().

  8. #8
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Si tu n'a pas de formulaire ou de soumission, tu peut juste utiliser une requête SQL qui va voir si il y a déjà un enregistrement comme l'a dit RunCodePhp.
    Le côté AJAX permet d'éviter un rafraichissement de la page et de dynamisé le tous.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Par défaut
    //requête de recherche si ton employé a déjà été placé
    Mettons que mon employé est placé quand il possède une latitude et une longitude.
    Quelle est la requête pour savoir s'il est placé, je veux dire, si je fais qqch comme:

    SELECT IDENTIFIANT FROM EMPLOYES WHERE latitude is null and longitude is null and ID_EMPLOYE = id_employe;

    ça devrait ne rien renvoyer s'il est déjà placé, vu qu'il y aura des valeurs pour sa longitude et sa latitude...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(xhr.readyState == 4 && xhr.status == 200){
    						if(xhr.responseText == 0) {
                                                      alert("L'employé à déjà été placé.");
                                                      return false;
                                                    } else
                                                      return true;
    					}
    Autrement,ici, dans le cas ou l'employé est déjà placé, ça génère une alerte mais est ce que ça empêche aussi de le placer, une fois l'alerte fermée ?

Discussions similaires

  1. Sécuriser une transaction avec rollback
    Par AIRONE dans le forum Sécurité
    Réponses: 1
    Dernier message: 14/09/2007, 14h42
  2. Fonctionnement simplifié d'une transaction Oracle
    Par jack554 dans le forum Oracle
    Réponses: 7
    Dernier message: 21/04/2005, 10h25
  3. comment identifier une transaction http?
    Par didier.cabale dans le forum Développement
    Réponses: 5
    Dernier message: 13/04/2005, 16h42
  4. [SGBD]Evaluation du temps d'une transaction
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 26/10/2004, 17h53
  5. Utilisation d'une transaction
    Par Bernard M dans le forum Bases de données
    Réponses: 6
    Dernier message: 21/04/2004, 23h31

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