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

Langage PHP Discussion :

Demande d'aide pour transcrire Javascript en PHP [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut Demande d'aide pour transcrire Javascript en PHP
    Bonjour, je souhaiterais passer la fonction de contrôle sur les champs d'un formulaire du Javascript en PHP
    car sinon mes contrôles sur mon formulaire sont trop facilement court-circuitées

    Voici la partie du code qui me pose des problèmes

    1) Appel de la fonction valider_formulaire en JS sur onsubmit dans la page html
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="http://XXX/action_page.php" method="post" onsubmit="return valider_formulaire(this);" target="_blank">

    2) La fonction valider_formulaire en JS
    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
    44
     
    function valider_formulaire(thisForm) {
    	lst=thisForm.getElementsByTagName('input');
    	selector = "taken";
    	var invalide=true;
    	for (i=0;i<lst.length;i++) {
    		if (lst[i].className.indexOf(selector)!=-1){
    			if (lst[i].type.toLowerCase()=="checkbox") {
    				if (lst[i].checked) {
    					invalide=false;
    					break;
    				}
    			}
    		}
    	}
        if (invalide) {
    	    alert("Merci de sélectionner au moins un produit, s'il vous plait");
    		return false;
    	}
     
    	if (thisForm.prenom.value == '') {
    		alert('Votre prenom doit être rempli');
    		thisForm.prenom.focus();
    		return false;
    	}
    	var c = 0;
    	for (var i = 0; i < thisForm.elements.length; i++) {
    		if (thisForm.elements[i].name == "contact[]") c++;
    	}
    	var elts = thisForm.elements['contact[]'];
    	var compteur = 0;
    	if (c == 1) {
    		if (elts.checked == true) compteur++;
    	} else {
    			for (var i = 0; i < c; i++) {
    				if (elts[i].checked == true) compteur++;
    			}
    	}
    	if (compteur == 0) {
    		alert("Merci d'indiquer un choix (Tout est OK ou demande à être recontacté), s'il vous plait");
    		return false;
    	}
    	return true;
    }
    Première question : Comment appeler ma fonction PHP car je suppose que dans le onsubmit je peux pas la placer

    Merci d'avance pour vos réponses
    Laurent

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Première réponse : le contrôle PHP se fait à reception du formulaire donc dans action_page.php

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Tu ne peux pas traduire exactement ta fonction JavaScript, car elle s'appuie en partie sur des informations qui ne sont pas transmises au serveur (exemple className). Les seules informations transmises au serveur sont les attributs name et value. Fais un print_r($_POST) ou un var_dump($_POST) pour voir quelles valeurs tu reçois, ça te donnera une idée de comment les vérifier.

    De ton code JavaScript je peux tirer les conclusions suivantes :
    • Au moins un checkbox doit être coché, mais je ne sais pas comment il s'appelle (celui qui correspond au message « sélectionner au moins un produit ») ;
    • Le prénom ne doit pas être vide (d'ailleurs, un appel à trim sera plus fiable qu'une simple comparaison à '') ;
    • Un champ contact[] doit être coché.


    Dans le cas des checkboxes et boutons radio, si rien n'est coché, il n'y aura pas d'entrée avec ce name dans $_POST. Si un input est coché, l'entrée contiendra la donnée de l'attribut value, ou bien 'on' s'il n'y a pas d'attribut value.

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Merci Sabotage et Watilin,
    Oui je vois que je ne vais pas pouvoir traduire littéralement et donc je vais avoir un
    peu de tâtonnement, je reviendrai quand j'aurai un peu avancé là-dessus ...

    pour Watilin , je vais suivre tes conseils, effectivement c'est la partie Au moins (un checkbox doit être coché)
    qui va me poser des problèmes ... j'ai une liste qui provient d'une table SQL et qui est fluctuante (Ajout, MAj et suppression).
    Grâce à PHP, et aussi à ce forum , je la propose à l'utilisateur avec pour chacune de ces lignes, une checkbox ... et je dois bien tester à l'envoi
    de mon formulaire que l'utilisateur a au moins validé une ligne ...

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bon j'ai avancé sur cette partie, déjà acheté un bon bouquin.

    J'ai laissé les contrôles JS existant
    puis j'ai recréé les mêmes en PHP :

    1) Test si les champs sont vides avec isset

    2) Encadrer tous les $_POST de type chaine de caractères avec un htmlspecialchars

    3) Contrôler au mieux la saisie du téléphone et mail avec du regex

    4) Tester qu'au moins une case à cocher est ... cochée
    avec ce type de boucle

    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
     
    	$compt_choix = 0;	
    	if (isset($_POST['choix']))
    		{
    			foreach($_POST['choix'] as $valeury)
    			{
    			if (isset($_POST['choix']))
    				$compt_choix++;	
    			}
    		}	
    	if ($compt_choix == 0)
    		{
    			$error = true;
    			$nberror++; 
    		}
    5) Reste la partie envoi de mail que je confie à PHPMailer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $mailP = new PHPmailer();
    $mailP->IsHTML(true);
    $mailP->CharSet = 'UTF-8';   
    $mailP->From='contact@XXXXXXXXXXXXX.com';
    $mailP->AddAddress($destinataire);
    $mailP->FromName="XXXXXXXXXXXXXX";
    $mailP->Subject=$sujet;
    $mailP->Body=$message;
    if(!$mailP->Send()){
    ...
    6) et j'allais oublié en début de mon script PHP
    un test "referer" sinon sortie de programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(isset($_SERVER['HTTP_REFERER'])
      && $_SERVER['HTTP_REFERER']!=''
      && substr($_SERVER['HTTP_REFERER'], 7, strlen($_SERVER['SERVER_NAME'])) == $_SERVER['SERVER_NAME'])
    ...
     
    {

    Merci pour vos commentaires, remarques ...
    Laurent

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le code 1 se resume à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (empty($_POST['choix'])) {
    Si aucune checkbox n'a été cochée, $_POST['choix'] n'existe pas, donc toutes tes boucles (qui en plus sont fausses) sont inutiles.

    Pour le code 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!empty($_SERVER['HTTP_REFERER'])) {
       $referer = parse_url($_SERVER['HTTP_REFERER']);
       if ($referer['domain'] != $_SERVER['SERVER_NAME']) {

  7. #7
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    D'accord avec ça Sabotage !
    Je corrige de suite ...

  8. #8
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Referer est optionnel selon la spécification de HTTP. Les navigateurs ne sont pas obligés d'en envoyer un. De plus, ça touche à la vie privée de l'utilisateur et il y a des extensions (ou même simplement les préférences des navigateurs) qui permettent de le désactiver. Pire, il peut être modifié par des outils de création de requêtes HTTP comme wget.
    Bref, un site moderne ne se base pas dessus. Si tu veux vérifier que l'utilisateur vient d'une page de ton site, tu peux utiliser une session, un token passé par formulaire, ou une combinaison des deux.

  9. #9
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Je rouvre ce sujet,

    Merci Watilin pour cette remarque judicieuse , j'avais lu un avertissement de ce genre
    quelque part et je suis justement en train de regarder les sessions

    Pour tout dire je développe des sites sous Joomla et normalement je ne m'occupe
    pas de la mécanique interne (supposée blindée) MAIS par rapport à certaines demandes de mes clients,
    je dois quand même mettre les mains dans le cambouis et comme j'ai une formation
    informatique à la base ... de fil en aiguille je cherche à blinder mon propre code car du code
    perso représente (bien sûr) une faille potentielle

    Voici le type de code, par exemple, à utiliser dans un script pour échanger avec Joomla
    https://docs.joomla.org/How_to_acces...xternal_script
    http://www.phptoolbox.net/tutoriels/...on-avec-joomla

    Le soucis présent en l'occurrence est que le formulaire de passage de commande est ouvert à tout public, la "validité" de la commande
    est basée sur un numéro de téléphone + adresse mail valide (regex) ... le client passe un coup de fil à l'acheteur potentiel
    en cas de nouveau venu ou de doute ...

  10. #10
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Pour les sessions, je récupère bien mon id maintenant ...

    Donc l'idée est que
    1) Je stocke cet id au passage quand je récupère mes données avec mon 1er script PHP/ Mysql et que je remplis mon formulaire
    2) Lorsque je valide le formulaire et avant de lancer les vérifications dans mon 2ème script, je compare l'id de session en cours
    et l'id stocké et si c'est différent j'arrête tout.

    Est-ce que cette façon de procéder est OK ?

  11. #11
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Eh bien oui, ça me paraît OK. Juste pour être sûr, il ne faut pas que l'id de session apparaisse côté client. Je ne sais pas comment c'est fait dans Joomla, mais si l'id que tu récupères est celui qui est stocké dans le cookie de session, il faut que tu trouves autre chose. Sinon ça ouvre la possibilité d'attaques à base de forçage d'id de session.

    Il y a quelques principes généraux sur cette page et dans les cours et tutoriels pour apprendre la programmation PHP, ça peut être intéressant de la lire en entier

  12. #12
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Ah bonne remarque (cookie de session)
    et lien bien utile !
    Je vais enquêter auprès de ma "communauté" là-dessus ...

    Sinon pour l'instant :
    1) Je stocke donc cet id au passage quand je récupère mes données avec mon 1er script PHP/ Mysql et que je remplis mon formulaire
    et je créé en + une autre variable de session MAVAR = $_SERVER['REMOTE_ADDR']

    2) Lorsque je valide le formulaire et avant de lancer les vérifications dans mon 2ème script, je compare l'id de session en cours
    et l'id stocké et si c'est différent j'arrête tout.
    et je compare en + le contenu de MAVAR avec $_SERVER['REMOTE_ADDR'] et si c'est différent j'arrête tout aussi ...

    [EDIT]
    J'ai remplacé $_SERVER['REMOTE_ADDR'] par la fonction g_ip() plus propre à priori ...
    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
     
    <?php
    function g_ip() 
    {
    	// IP internet partagé
    	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    		return $_SERVER['HTTP_CLIENT_IP'];
    	}
    	// IP derrière proxy
    	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    		return $_SERVER['HTTP_X_FORWARDED_FOR'];
    	}
    	else {
    		return $_SERVER['REMOTE_ADDR'];
    	}
    }
    echo 'Adresse IP réelle: ' .g_ip();
    ?>

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

Discussions similaires

  1. demande d'aide pour créer des scripts en Javascript
    Par blueyes29 dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 28/12/2010, 20h52
  2. [MySQL] Demande d'aide pour une erreur php
    Par spespam dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/12/2008, 16h22
  3. Demande d'aide pour un menu javascript
    Par Lost-H dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/06/2006, 16h17

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