Pages :
Bonjour,
Je tourne en rond depuis un petit moment déjà.
Le site pour lequel j'ai besoin d'aide est réalisé à l'aide de Divi.
Dans la page "Abbayes", j'ai environ 1.600 lignes dont les données sont stockées dans une base de données MySQL.
Chacune de ces lignes permet d'obtenir plus de détails sur tel ou tel établissement en fonction du lien suivant :
<a href="reception?num=201" title="GET" target="_blank" rel="noopener noreferrer">201</a>

Dans la page "Reception", je récupère sans problème le contenu de ma variable :
<?php
echo $_GET['num'];
?>

Par contre je n'arrive pas à trouver le bon code pour faire apparaître toutes les données afférentes à cette variable. Voici le code complet sans la partie connexion :
<?php
........ (Connexion à la BDD)

$query = $pdo->query("SELECT * FROM `wp_abbayes` WHERE `Code` LIKE '????????'");
$resultat = $query->fetchAll();

print("<table border=\"1\">");

foreach ($resultat as $key => $variable)
{
print("<tr>");
print("<td>".$resultat[$key]['Code']."</td>");
print("<td>".$resultat[$key]['Code_Dept']."</td>");
print("<td>".$resultat[$key]['Nom']."</td>");
print("<td>".$resultat[$key]['Commune']."</td>");
print("<td>".$resultat[$key]['Departement']."</td>");
print("<td>".$resultat[$key]['Region']."</td>");
print("<tr>");
}

print("</table>");
?>

Je remercie par avance toute personne qui voudra bien consacrer un peu de temps à me donner une réponse.
Salut,

Il faudrait utiliser les balises "code" de coloration syntaxique (que l'on trouve au dessus du bouton envoyer) pour mettre en forme ton code.

A priori si tu as besoin de passer des paramètres, tu va devoir utiliser les fonctions prepare et execute à la place de query. Cela donnera un truc dans le genre :


$query = $pdo->prepare("SELECT * FROM wp_abbayes WHERE Code=:num");
$query->execute(['num' => $_GET['num']]); 
$resultat = $query->fetchAll();

Modifié par Mathieuu (28 Feb 2020 - 10:04)
Excellent, merci de ton aide, le résultat obtenu est tout à fait ce que je souhaite.
Rapidité et efficacité, merci.
J'ai remplacé ton like par un égal vu que cela semble être un numéro.
Idéalement il faudrait aussi vérifier que $_GET['num'] contient bien un numéro avant de s'en servir dans le execute.
Bonjour,

Que vois-je ? Là je bondis et me demande si vous avez bien conscience que $query->execute(['num' => $_GET['num']]) n'est donné qu'à titre pédagogique et qu'en réalité il vous faudra d'abord assainir la donnée GET, l'attribuer à une variable et que ce sera cette variable qui viendra en lieu et place dans cette commande.

Au final vous aurez un truc du genre :

$my_data = '';
if (!empty($_GET['num'])) {
  $my_data = fonction_assainir($_GET['num']);
}
if (!empty($my_data)) {
  $query = $pdo->prepare("SELECT * FROM wp_abbayes WHERE Code=:num");
  $query->execute(['num' => $my_data]); 
  $resultat = $query->fetchAll();
}

Mais cela vous le saviez déjà, n'est-ce pas ? Smiley cligne Smiley biggrin
Modifié par Greg_Lumiere (28 Feb 2020 - 10:22)
La variable est bien une valeur numérique. J'ai donné un code à chacune des abbayes / chartreuses, ce code étant composé du numéro du département suivi d'un numéro à deux chiffres (pas plus d'une centaine d'établissements par département heureusement).
Ton code fonctionne parfaitement. Pour l'heure je développe en local avec Laragon, il ne me reste plus qu'à appliquer cela sur la version en ligne.
Salut

Numérique ou pas, c'est une variable venant d'un GET donc très facilement piratable.

Il suffit de capturer ton url, de capturer ta variable, et avant de lancer le formulaire faire un
";drop database" à la place, et le tour et jouer.
Je n'ai pas tellement tester pdo, mais de ce que j'avais retenu comme intérêt principale de pdo (en séparant bien la requête dans le prepare (sans y mettre de variable php...) et les paramètres dans le exécute) c'est qu'on ne pouvait pas subir d'injection sql Smiley sweatdrop

Après j'ai tendance à préférer vérifier les "types", j'aurai donc sans doute rajouté soit un cast en int, soit une vérification à base de filter_validate_int ou filter_sanitize_number_int ou via pdo un $query->bindParam(':num', $_GET['num'], PDO::PARAM_INT); mais j'étais vaguement sur que c'était optionnel Smiley sweatdrop
JENCAL a écrit :
Salut

Numérique ou pas, c'est une variable venant d'un GET donc très facilement piratable.

Il suffit de capturer ton url, de capturer ta variable, et avant de lancer le formulaire faire un
";drop database" à la place, et le tour et jouer.

Et quelle méthode préconises tu pour sécuriser cette variable numérique ?
Merci
Oursfort a écrit :

Et quelle méthode préconises tu pour sécuriser cette variable numérique ?
Merci


Tout ce que Greg/Mathieuu ont déjà dit
Modifié par JENCAL (28 Feb 2020 - 11:56)
Bonjour,
Je pense que tout le monde a perçu le fait que je ne sois qu'un débutant en PhP. J'ai eu programmé mais il y a longtemps de cela dans les années 80 au CERN, ça date.
Je n'ai pas besoin de grand chose, simplement d'accéder à partir d'un tableau (Extension Tablepress de Wordpress) à une page sur laquelle s'afficheront toutes les données (une vingtaine) afférente à telle ou telle abbaye ou chartreuse.
Au vu des conseils précédents, je suis effectivement en train de me pencher sur POST pour remplacer GET dans mon lien :
<a href="reception?num=201" title="GET" target="_blank" rel="noopener noreferrer">201</a>
(201 étant ma variable).
Je vais donc continuer à étudier cela et vous remercie de vos conseils.
Modérateur
Bonjour, concernant la sécurité, il n'est absolument pas nécessaire de nettoyer la variable si elle est dans une requête préparée (elle ne sera jamais exécutée).
Greg_lumiere et Jencal ont tord, le code qu'a proposé Matthieu est parfaitement sécurisé.

Vérifier le contenu avant permet juste d'éviter des bugs dans certains cas mais n'aura aucun effet sur la sécurité.

Utiliser POST plutôt que GET n'apporte rien en terme de sécurité (on peut aussi remplacer les valeurs). De plus mettre la valeur dans l'URL me semble plus pertinent pour ce genre d'affichage (On obtient un lien que l'on peut partager, mettre en favoris, rafraichir la page, etc.).
Modifié par kustolovic (29 Feb 2020 - 12:18)
Merci pour ce message.
J'ai déjà effectivement testé la solution de Mathieuu qui est parfaitement fonctionnelle.
Et comme précisé par le même intervenant il n'est effectivement pas inutile de vérifier que la variable soit une donnée numérique comprise entre telle et telle valeur.
Merci à tous pour vos renseignements.
Merci à tous pour vos réponses.
La solution de Mathieuu est effectivement fonctionnelle.
Avant la connexion, j'ai rajouté une double condition, à savoir que ma variable est composée de quatre et seulement quatre caractères et qu'elle est intégralement numérique.
Si l'une de ces deux conditions n'est pas respectée la connexion échoue.
Ma demande est donc résolue.
Modérateur
«La question est un poil plus complexe»

Oui, bon enfin, en effet, si on utilise une version de mysql pas à jour avec des failles et une version php obsolète (5.2 ou moins), et des jeux de caractères exotiques, il existe un risque.

C'est le cas pour tout, il y a des failles, on ne les évite pas en écrivant du code farfelu mais en maintenant ses dépendances à jour. Toutes les procédure inutiles de nettoyages des valeurs peuvent potentiellement avoir les mêmes failles (ou d'autres).
Modifié par kustolovic (04 Mar 2020 - 16:30)
Bonsoir,
Et merci pour vos réponses.
Je suis en train d'envisager une autre solution avec une extension de l'extension Tablepress de Wordpress :
http://tablepress.org/extensions/php-in-tables/
Cette extension me permet d'injecter directement du code PhP dans mes tableaux.
Cela me permet de me passer des liens insérés dans mes tableaux et donc de m'affranchir de la méthode GET.
Je découvre cela ce soir et me pencherai là dessus plus en détail demain matin.
Je vous tiendrai bien sur informé de la suite.
Tu devrait regarder ce que sont les customs post types et les custom fields de wordpress car c'est ce qui fait justement sa force pour créer des listes de pages comme tu sembles vouloir le faire.

Autrement tu vas te faire beaucoup de mal en t'affranchissant de la méthode get et encore plus à essayer d'insérer du php directement dans tes pages. D'abord c'est dangereux et ça veux dire en plus que tu vas devoir copier/coller du code pour toutes tes pages, ce n'est pas viable.
Pages :