OVH Cloud OVH Cloud

transfer numero id vers un autre p age

1 réponse
Avatar
Georges
Bonjour,

Il agit le transfert d'un numéro id d'un table via un lien vers un page
(par exemple entre listforum et lireforum.php
Avec EasyPhp 1.6 tout avait bien marché ainsi que cela marche aussi sur
mon hébergeur OVH. Mais sous EaysyPhp 1.8 si j'essaye de de le faire je
vois bien le numero id comme extension dans la barre d'adresse de la
page (readforum.php mais le variable $n se ne effectue pas.

Si je envoye un script d'inscription dans la base provenant un
formulaire, j'utilise bien $_POST|['data']; mais je ne sais pas comment
faire si il s'agit avec un variable transferré par un lien.

ex.
lien dans la page listforum.php
<?php echo
stripslashes($comment['subject']).'&nbsp;&nbsp;-&nbsp;&nbsp;'.stripslashes($comment['title']).'&nbsp;&nbsp;-&nbsp;&nbsp;'.stripslashes($comment['author']).'&nbsp;&nbsp;-&nbsp;&nbsp;'.$comment['date'].'</i>';?>&nbsp;&nbsp;-&nbsp;&nbsp;<a
href="readcomment.php?c=<? echo $comment['id_comment']; ?>">read the
comment...</a>

script dans la page readforum.php
<?php
include ("../lsd/conf.inc.php");
$connect= mysql_connect($host,$login,$pass);
mysql_select_db($base, $connect);
$query="SELECT * FROM mirtrandir_news WHERE idnews=$n";
$result=mysql_query($query, $connect);
$news = mysql_fetch_array($result);
{
?>

lien dans la barre d'adresse :
http://127.0.0.1/MIRTRANDIR/weblog/readforum.php?n=1
Mais il n y à pas de données qui se transferrent et montrent dans le
navigateur

Que devais je faire afin le transfer fonctionne

Mer remerciemments à l'avance

Georges Kuntz

1 réponse

Avatar
Calimero
wrote:

Si je envoye un script d'inscription dans la base provenant un
formulaire, j'utilise bien $_POST|['data']; mais je ne sais pas comment
faire si il s'agit avec un variable transferré par un lien.


A priori, plutôt du $_GET, ou simplement du $_REQUEST.

ex.
lien dans la page listforum.php
...

href="readcomment.php?c=<? echo $comment['id_comment']; ?>">read the
comment...</a>


"readcomment.php", paramètre "c".

lien dans la barre d'adresse :
http://127.0.0.1/MIRTRANDIR/weblog/readforum.php?n=1


"readforum.php", paramètre "n".

Bon, y a un soucis: ce que tu expliques ne correspond pas au code que
tu fournis.

Admettons que le but est de passer un paramètre numérique (genre un
ID) d'une page A.php à une page B.php.

Tu génères des liens du type:
<a href="B.php?idB">Go to B</a>

Si je me fie à ton code sensé récupérer le paramètre:

script dans la page readforum.php
<?php
include ("../lsd/conf.inc.php");
$connect= mysql_connect($host,$login,$pass);
mysql_select_db($base, $connect);
$query="SELECT * FROM mirtrandir_news WHERE idnews=$n";
$result=mysql_query($query, $connect);
$news = mysql_fetch_array($result);
{
?>


Soit du code est absent (pas d'affectation de $n), soit tu comptes sur
l'activation des regiser_globals dans ton installation de PHP.
Hormis le fait que ce soit généralement mal d'utiliser le principe des
register_globals (parce que c'est très souvent mal utilisé), tu
produis des scripts qui marcheront sur certains PHP et pas d'autres.
Il n'est pas improbable que la configuration par défaut d'EasyPHP ait
changé entre les deux versions (déactivation de register_globals sur
la 1.8).

C'est donc l'occasion de mettre à jour tes scripts, ou de prendre le
"bon pli" tout de suite en oubliant les register_globals.

Dans ton cas, un code très très basique serait le suivant:

$n = $_REQUEST['n'];
// ou
$n = $_GET['n'];
$sql = "SELECT ... WHERE Id = $n";

Avec ca, register_globals ou pas, ca marchera.

On en vient alors au prochain problème: on passe des informations non
validées à une requête SQL sans aucun contrôle (risque d'injection
sql). Les conséquences d'une gestion aussi légère des entrées
utilisateurs vont de la divulgation de ta base, à sa suppression pure
et simple selon l'humeur du plaisantin en face et les privilèges de
ton utilisateur mysql.

Il faut donc que tu t'écrives (ou que tu récupères, en étudiant bien
le code) des fonctions qui vont venir au-dessus de
$_GET/$_POST/$_REQUEST pour valider/nettoyer les valeurs passées.

On peut imaginer une fonction du genre:

function getRequestInt($varname, $default)
{
// A écrire !
}

Cette fonction irait récupérer $_REQUEST[$varname] en s'assurant que
la valeur est bien définie (isset), en faisant un peu le ménage (genre
trim()), en s'assurant qu'elle est bien un nombre entièr, puis en
"castant" la valeur en (int) avant de la retourner. Bien sûr, si l'un
des contrôles échoue, tu retournes la valeur par défaut.

Même prudence pour les chaînes de caractères.

Puis finalement, à la construction des requêtes SQL, tu vas devoir
passer les chaines à la moulinettes pour neutraliser les caractères
interdits:

Ex:
$nom = "Bob l'Eponge";
$sql = "SELECT * FROM Utilisateurs WHERE Nom = '" . $nom . "'";
==> à l'exécution de la requête, ca va vautrer. En plus d'être
fonctionnellement défectueux, tu as le même risque qu'évoqué plus
haut: risque de se faire voler/corrompre ta base.

Mieux:
$nom = "Bob l'Eponge";
$sql = "SELECT * FROM Utilisateurs WHERE Nom = '";
$sql .= mysql_real_escape_string($nom, $db) . "'";
Au final, ca produit la requête SQL suivante:
$sql = "SELECT * FROM Utilisateurs WHERE Nom = 'Bob l'Eponge'";
Qui sera correctement interprétée.

Bref, je te conseille de lire:
http://www.saphirtech.com/securite_web_dynamique.pdf
Guide produit par un des contributeurs de ce même groupe qui casse
certaines très mauvaises idées et met sur le doigt sur les mauvaises
pratiques.

--
@+
Calimero