Sécurité traitement PHP et condition ignorée (Créer un compte)

  • WordPress :5.5
  • Statut : non résolu
3 sujets de 1 à 3 (sur un total de 3)
  • Auteur
    Messages
  • #2360397
    mumu51
    Participant
    Padawan WordPress
    82 contributions

    Bonjour,

    Ma configuration WP actuelle

    • Version de PHP/MySQL : 7.4
    • Thème utilisé : Je le fais moi-même
    • Extensions en place : Askimet et Caldera Forms
    • Nom de l’hébergeur : En local

    Problème(s) rencontré(s) :

    J’élabore un thème pour un traiteur, et celui-ci permet l’enregistrement d’un devis, dans une base de donnée.
    Mon client peut ensuite récupérer ses devis depuis l’administration WordPress, seulement, puisqu’on parle de base de données, je souhaite lui offrir le maximum de sécurité.
    Ainsi, je souhaiterais avoir des conseils sur comment améliorer mon traitement php ci-après :

    <?php
    if ( !defined('ABSPATH') ){
    	define( 'ABSPATH', dirname(__FILE__, 5) . '/' );
    }
    require_once(ABSPATH . 'wp-load.php');
    
    global $wpdb;
    $validate = false;
    
    function insertDevis($wpdb, $regimes, $services){
    
    	$table_devis = $wpdb->prefix . 'devis';
    	$table_prospects = $wpdb->prefix . 'prospects';
    	$table_regimes = $wpdb->prefix . 'regimes';
    
    	$date_devis = date("Y-m-d");
    	$evenement = $_POST['evenement'];
    	$date_evenement = $_POST['date'];
    	$date_event_sql= date('Y-m-d', strtotime(str_replace ('/', '-', $date_evenement)));
    	$heure_evenement = $_POST['heure'];
    	$convives = $_POST['convives'];
    	$lieu = $_POST['lieu'];
    	$budget = $_POST['budgetOption']." ".$_POST['options_budget'];
    	$services = $services;
    	$materiel = $_POST['materiel'];
    
    	$devis = array('date_devis' => $date_devis, 'evenement' => $evenement, 'date_evenement' => $date_event_sql, 'heure_evenement' => $heure_evenement, 'convives' => $convives, 'lieu' => $lieu, 'budget' => $budget, 'services' => $services, 'materiel' => $materiel);
    	$wpdb->insert($table_devis,$devis);
    	$id = $wpdb->insert_id;
    	$_SESSION['num_validate'] = $id;
    
    	$regimes = $regimes;
    	$allergies = $_POST['allergies'];
    
    	$regimes_convives = array('devis' => $id, 'regimes' => $regimes, 'allergies' => $allergies);
    	$wpdb->insert($table_regimes,$regimes_convives);
    
    	$civilite = $_POST['options_genre'];
    	$nom = $_POST['name'];
    	$prenom = $_POST['firstname'];
    	$email = $_POST['email'];
    	$telephone = $_POST['telephone'];
    	$horaires_contact = $_POST['indications'];
    	$devis = $id;
    
    	$prospects = array('civilite' => $civilite, 'nom' => $nom, 'prenom' => $prenom, 'email' => $email, 'telephone' => $telephone, 'horaires_contact' => $horaires_contact, 'devis' => $devis);
    	$wpdb->insert($table_prospects,$prospects);
    
    	flush_rewrite_rules();
    }
    
    if(!isset($_POST['lieu']) && !isset($_POST['date']) && !isset($_POST['heure']) && !isset($_POST['convives']) && !isset($_POST['options_budget']) && !isset($_POST['budgetOption']) && !isset($_POST['options_genre']) && !isset($_POST['name']) && !isset($_POST['email'])){
    	$message = "Votre saisie est incorrecte, veuillez vérifier si :
    	- le lieu de l'événement a été saisi,
    	- la date et l'heure sont corrects,
    	- le nombre de convives est au minimum de 15,
    	- votre budget a bien été défini,
    	- votre civilité et votre nom sont au moins renseignés,
    	- un moyen de contact a bien été renseigné.";
    }
    else{
    
    	if(isset($_POST['options_regimes'])){
    
    		$regimes = implode(" ", $_POST['options_regimes']);
    
    		$verification = $wpdb->get_results('SELECT *, DATE(date_devis) AS "Date du devis", CURDATE(), DATEDIFF(date_devis, CURDATE()) AS "Difference"
    		FROM $table_devis
    		JOIN $table_prospects ON $table_devis.id = $table_prospects.devis
    		WHERE $table_prospects.civilite = $_POST[\'name\']
    		AND $table_prospects.nom = $_POST[\'name\']', OBJECT);
    
    		if ($verification && $verification->Difference >= -30){
    			$message = "<div class=\"alert alert-primary\" role=\"alert\">Une demande de devis a déjà été enregistré pour cette personne, il y a un peu moins d'un mois. 
    			<br/>Pour toute modification ou complétion de demande, merci de m'en faire part directement à l'adresse email <b>adresse@email.com</b> par téléphone au <b>3280</b> ou depuis la page de contacts.
    			<br/>Tout autrement, sachez que je fais le maximum pour envoyer ce devis dans les plus brefs délais. :)</b>.</div>";
    		}
    		else{
    
    			if(isset($_POST['options_services'])){ 
    
    				$services = implode(" ", $_POST['options_services']); 
    				insertDevis($wpdb, $regimes, $services);
    
    			}
    			else{ insertDevis($wpdb, $regimes); }
    
    			$validate = true;
    		    $message .= "<div class=\"d-flex flex-column text-center\">";
    		    $message .=	"<h1 class=\"mt-md-5 text-center\">C’est noté !</h1>";
    		    $message .=	"<p class=\"lead mb-0\">Je vais faire le maximum pour vous envoyer ce devis dans les plus brefs délais.</p>";
    		    $message .=	"<p class=\"lead mb-5\">Voici ci-après la référence de votre devis, très utile pour faciliter nos échanges.</p>";
    		    $message .= "</div>";
    
    		}
    	}
    }
    
    get_template_part('templates-parts/header/header','message');
    echo '<div class="container container-checkout-form">';
    
    if($validate == true){ get_template_part('templates-parts/message/message','success'); }
    else{get_template_part('templates-parts/message/message','error'); }
    
    echo $message;
    
    if($validate == true){ echo "<p class=\"display-3 sj-color-primary font-weight-bold mb-5 text-center\">". $_SESSION['num_validate'] ."</p>";}
    
    echo '<p class="lead mb-5 text-center">Merci pour votre confiance !</p>';
    echo '<a href="'.home_url('/').'" class="sj-btn sj-btn-primary">Retour sur le site</a>';
    
    echo '</div>';
    get_template_part('templates-parts/footer/footer','message');
    
    ?>
    Traitement de mon formulaire en php

    Je tiens à préciser que pour certaines raisons (notamment pour le côté interactif), je fais déjà un gros traitement en jQuery avant un traitement en PHP.

    Aussi, tant que nous parlons de ce bout de code que je partage, je remarque que lorsque je fais exprès de saisir des informations préalablement déjà saisies (ex : la même personne), ma vérification est complètement ignorée, l’enregistrement se réalise tout de même.
    Et justement, en terme de sécurité je m’interroge, car pour moi, c’est un coup à faire tomber le serveur…

    Je pense que cette partie pose problème mais je ne sais pas pourquoi :

    if(isset($_POST['options_regimes'])){
    
    	$regimes = implode(" ", $_POST['options_regimes']);
    
    	$verification = $wpdb->get_results('SELECT *, DATE(date_devis) AS "Date du devis", CURDATE(), DATEDIFF(date_devis, CURDATE()) AS "Difference"
    	FROM $table_devis
    	JOIN $table_prospects ON $table_devis.id = $table_prospects.devis
    	WHERE $table_prospects.civilite = $_POST[\'name\']
    	AND $table_prospects.nom = $_POST[\'name\']', OBJECT);
    
    	if ($verification && $verification->Difference >= -30){
    		$message = "<div class=\"alert alert-primary\" role=\"alert\">Une demande de devis a déjà été enregistré pour cette personne, il y a un peu moins d'un mois. 
    		<br/>Pour toute modification ou complétion de demande, merci de m'en faire part directement à l'adresse email <b>adresse@email.com</b> par téléphone au <b>3280</b> ou depuis la page de contacts.
    		<br/>Tout autrement, sachez que je fais le maximum pour envoyer ce devis dans les plus brefs délais. :)</b>.</div>";
    	}
    
    [...]
    Vérification de doublons

    J’ai essayé OBJECT_K, mais ça ne change rien. Auriez-vous des suggestions ?

    Merci d’avance et bonne soirée !

    • Ce sujet a été modifié le il y a 21 heures et 43 minutes par mumu51.
    #2360422
    mumu51
    Participant
    Padawan WordPress
    82 contributions

    S’il vous plaît ?

    #2360479
    mumu51
    Participant
    Padawan WordPress
    82 contributions

    Petit up : j’ai su corrigé mon problème par rapport à la condition ignorée, par contre, je suis toujours preneuse sur la façon de sécurité mon traitement PHP. 😉☺️

3 sujets de 1 à 3 (sur un total de 3)
  • Vous devez être connecté pour répondre à ce sujet.