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']).' - '.stripslashes($comment['title']).' - '.stripslashes($comment['author']).' - '.$comment['date'].'</i>';?> - <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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
Georges@news56rd.b1.woo 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.
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.