Undefined index en php? [Résolu]

Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 02:39 - Dernière réponse : Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention
- 1 août 2011 à 10:59
Bonjour,

Notice: Undefined index: admin in C:\wamp\www\calendrier_bo.php on line 13

je reçois ce message d'erreur (surtout en localhost-wamp).
Mais le fichier fonctionne malgré cela.
Comment dois-je écrire cette instruction?
Merci de votre compréhension.

<html>
<head>
<title>index</title>
<link href="calendar.css" rel="stylesheet" type="text/css">
</head>


<?php
session_start();

if(isset($_POST['pwd']) AND $_POST['pwd']=="Georges974") $_SESSION['admin']=true;

if($_SESSION['admin'])
{

include("fonctions.php");
// recuperation du jour, mois, et année actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et année correspondent au mois et à l'année courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois précédent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'année en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau à 31 entrée (1 pour chaues jours) et on dit qu'aucuns jours n'est resevé
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion à la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservé dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>



<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
[tarifs.php Retour Le paille-en-queue]



<!--RETOUR-->


</html>
Afficher la suite 

Votre réponse

43 réponses

Meilleure réponse
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 30 juil. 2011 à 14:28
3
Merci
@kohntark
oui tu as raison (le hash) ça protege de rien comme ça dans ce script mais le hash c'est mieux et il suffit de changer un peu le script avec un token pour le renforcer donc voilà un subterfuge

exemple:



<?php
session_start();
$passfake=md5('Georges974fake'); //a personnaliser
$pass='Georges974'; //ce que tu veux
/* && et === sont plus strict au niveau du controle*/

if(isset($_POST['pwd']) && $_POST['pwd']===$pass && $_SERVER['REQUEST_METHOD']==='POST' && $_POST['passfake']===$passfake){
$_SESSION['admin']=true;
}else{
$_SESSION['admin']=false;
}

/*deconnection*/
if(isset($_GET['dec']) && $_GET['dec']==='medeconnecter'){
//session_start();
session_unset();
session_destroy();
header('Location: ?');exit;
}

if($_SESSION['admin']===true)
{

echo '[?dec=medeconnecter me deconnecter]
';

include("fonctions.php");
// recuperation du jour, mois, et annÚe actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et annÚe correspondent au mois et Ó l'annÚe courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois prÚcÚdent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'annÚe en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao¹t", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau Ó 31 entrÚe (1 pour chaues jours) et on dit qu'aucuns jours n'est resevÚ
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion Ó la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservÚ dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>
<!-- le html  ici -->
<html>
<head>
<title>index</title>
<link href="calendar.css" rel="stylesheet" type="text/css">
</head>




<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
[tarifs.php Retour Le paille-en-queue]



<!--RETOUR-->


</html>






Bonne programmation !

Merci cod57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 82 internautes ce mois-ci

Commenter la réponse de cod57
cs_47 197 Messages postés mardi 20 janvier 2004Date d'inscription 20 février 2013 Dernière intervention - 30 juil. 2011 à 10:28
0
Merci
Bonjour,

le session_start() en debut de script, doit être mis avant d'envoyer des données au navigateur

et pour ton undefined index admin, il faut tester si la variable est initialisé avant de l'utiliser

bonne journée
Commenter la réponse de cs_47
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 10:40
0
Merci
et pour ton undefined index admin, il faut tester si la variable est initialisé avant de l'utiliser
et comment je fais ça?
Commenter la réponse de Georges97427
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 30 juil. 2011 à 11:38
0
Merci
bonjour
les remarques de 47 sont les bonnes
... de plus il faut pouvoir se deconnester et
proteger un peu plus ton password donc voilà une modif de ton code plus sur à mon avis
a++

<?php
session_start();
$pass=md5('Georges974'); //plus dur à cracker
/* && et === sont plus strict au niveau du controle*/
if(isset($_POST['pwd']) && md5($_POST['pwd'])===$pass){
$_SESSION['admin']=true;
}else{
$_SESSION['admin']=false;
}

/*deconnection*/
if(isset($_GET['dec']) && $_GET['dec']==='medeconnecter'){
session_start();
session_unset();
session_destroy();
header('Location: ?');exit;
}

if($_SESSION['admin']===true)
{

echo '[?dec=medeconnecter me deconnecter]
';

include("fonctions.php");
// recuperation du jour, mois, et annÚe actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et annÚe correspondent au mois et Ó l'annÚe courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois prÚcÚdent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'annÚe en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao¹t", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau Ó 31 entrÚe (1 pour chaues jours) et on dit qu'aucuns jours n'est resevÚ
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion Ó la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservÚ dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>
<!-- le html  ici -->
<html>
<head>
<title>index</title>
<link href="calendar.css" rel="stylesheet" type="text/css">
</head>




<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
[tarifs.php Retour Le paille-en-queue]



<!--RETOUR-->


</html>



Bonne programmation !
Commenter la réponse de cod57
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 11:56
0
Merci
Salut,

<?php
$pass=md5('Georges974'); //plus dur à cracker
/* && et === sont plus strict au niveau du controle*/
if(isset($_POST['pwd']) && md5($_POST['pwd'])===$pass){
//...
?>

En quoi cela serait il plus dur à cracker ?
Je pense plutôt que ça ne sert à rien du tout, non ?
Quand on hash c'est la plupart du temps pour se préserver d'un piratage de la base de données. De cette manière le pass n'apparait jamais en clair et il n'est ("pas possible") de le retrouver.
Dans le cas présent si quelqu'un parvient à accéder à ton fichier PHP il aura de toute façon le pass en clair, ... il n'y a donc aucun intérêt à procéder ainsi.

... ou alors j'ai loupé quelque chose.

Cordialement,

Kohntark -
Commenter la réponse de kohntark
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 12:57
0
Merci
Merci pour vos réponses.
Mais je fais quoi maintenant comme solution???
Commenter la réponse de Georges97427
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 13:10
0
Merci
Salut,

Je pense que tu as toutes les infos qu'il te faut dans les messages précédents :
et pour ton undefined index admin, il faut tester si la variable est initialisé avant de l'utiliser
et comment je fais ça?

Cod57 a déjà donné la réponse, il faut utiliser la fonction isset() (cf la doc)

Pour le md5() => cf mon précédent post

En complément de ce que disait 47 :
le session_start() en debut de script, doit être mis avant d'envoyer des données au navigateur

... et ne doit par conséquent n'être appelé qu'une seule fois.
(dans le code qu'a écrit à ta place Cod57 il apparait également dans la déconnexion, c'est une erreur) (cf la doc)

Il y a sans doute encore des choses à revoir mais commence donc par mettre en place ce qui a été dit.

Cordialement,

Kohntark -
Commenter la réponse de kohntark
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 30 juil. 2011 à 13:34
0
Merci
bonjour @kohntark
en effet le session_start() est inutile dans la deconnection ... on pourrait avoir une erreur already started donc c'est faux en theorie mais l'erreur n'apparait pas vu que header() ... donc Georges pour plus de justesse

/*deconnection*/
if(isset($_GET['dec']) && $_GET['dec']==='medeconnecter'){
//session_start();
session_unset();
session_destroy();
header('Location: ?');exit;
}

mais pour le hash pas d'accord pour attaquer
ça prendrait plus de temps que en caractères clair même avec un dictionnaire de password
surtout pour un novice qui fait mumuse avec le formulaire d'ailleurs la plus part des hacks sont des recherches psychologiques date de naissance, nom de la copine ... voir l'affaire Obama il y a peu avec son facebook je crois ...
donc Georges le hash c'est mieux

Bonne programmation !
Commenter la réponse de cod57
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 14:00
0
Merci
donc Georges le hash c'est mieux

Non Georges, ça ne sert à rien !!

ça prendrait plus de temps que en caractères clair même avec un dictionnaire de password

Reprenons :
Le pass est envoyé en clair du client vers le serveur via un formulaire. Nous n'avons pas le choix (hors SSL et quelques autres subterfuges)
Le pass est écrit 'en dur' dans le fichier PHP.

Les 2 "seuls" moyens de pirater le pass :
1- écouter les connexions de Georges (man in the middle)
2- accéder au fichier PHP

Il y en a bien sur d'autres hein, mais qui ne sont pas le sujet ici :
- le revolver sur la tempe de Georges
- un keylogger
- le brute force
- etc ...

Pour le moyen 1 il n'y a rien à faire (hors SSL, anti replay ...) Le mot de passe sera intercepté et le pirate pourra s'identifier en admin.

Pour le moyen 2 il n'y a rien à faire non plus : le mot de passe étant en clair dans le fichier il suffira au pirate de ... le lire tout simplement.
Que tu haches par la suite ne change rien du tout.

Cordialement,


Kohntark-
Commenter la réponse de kohntark
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 30 juil. 2011 à 14:50
0
Merci
je precise pour renforcer le passfake
on peut rajouter un grain de sel
ex

<?php
session_start();
$salt=sha1($_SERVER['HTTP_HOST'].$_SERVER['REMOTE_ADDR'].date('YmdHi')); //se password change chaque minute 
$passfake=md5('Georges974fake'); //a personnaliser
$pass='Georges974'; //ce que tu veux
/* && et === sont plus strict au niveau du controle*/

if(isset($_POST['pwd']) && $_POST['pwd']===$pass && $_SERVER['REQUEST_METHOD']==='POST' && $salt===$_POST['salt'] && $_POST['passfake']===$passfake){
$_SESSION['admin']=true;
}else{
$_SESSION['admin']=false;
}

/*deconnection*/
if(isset($_GET['dec']) && $_GET['dec']==='medeconnecter'){
//session_start();
session_unset();
session_destroy();
header('Location: ?');exit;
}

if($_SESSION['admin']===true)
{

echo '[?dec=medeconnecter me deconnecter]
';

include("fonctions.php");
// recuperation du jour, mois, et annÚe actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et annÚe correspondent au mois et Ó l'annÚe courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois prÚcÚdent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'annÚe en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao¹t", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau Ó 31 entrÚe (1 pour chaues jours) et on dit qu'aucuns jours n'est resevÚ
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion Ó la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservÚ dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>
<!-- le html  ici -->
<html>
<head>
<title>index</title>
<link href="calendar.css" rel="stylesheet" type="text/css">
</head>




<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
[tarifs.php Retour Le paille-en-queue]



<!--RETOUR-->


</html>
Commenter la réponse de cod57
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 15:21
0
Merci
@Cod57
oui tu as raison (le hash) ça protege de rien comme ça dans ce script mais le hash c'est mieux et il suffit de changer un peu le script avec un token pour le renforcer donc voilà un subterfuge


Non, ça ne change rien et pour cette raison c'est moins bien que ne pas le mettre (ressources serveur, lisibilité, multiplication potentielle des bugs et des erreurs ...)

Pour reprendre les "moyens" évoqués plus haut :

- accès direct au fichier PHP (non interprété)
= > tu ne pourras jamais protéger quoi que ce soit si ce quoi que ce soit est écrit dans le fichier, ce qui est le cas ici (après faut obfusquer, et encore)

- man in the middle
=> le subterfuge que tu proposes n'a aucune efficacité.
Si je parviens à me mettre "au milieu" je récupère ce que Georges envoie lorsqu'il envoie le formulaire, à savoir, et entre autre :
passfake
pwd

Ces données transitent en clair sur le réseau.
Que passfake soit "salut", "mjkn\àççà}##\/;€=esfç_" ou un md5(), SHA1() (etc ...) de n'importe quelle chaîne ne change rien : je récupère les données sans avoir besoin de savoir à quoi elles correspondent à l'origine.
Je me contente seulement de reposter la requête POST vers le serveur.
Et là je suis admin, tout simplement.

Quand je parlais de subterfuge je pensais plutôt à de l'anti replay. Du style envoyer un ID qui n'est valable qu'une seule fois et pour un temps donné, ... mais là aussi c'est loin, très loin d'être gagné :
en étant toujours "au milieu" mon petit robot sera 1 million de fois plus rapide à répondre que Georges, qui soumettra donc son formulaire bien après, et qui se fera jeter.

J'aurai tendance à dire SSL ou rien.

Est ce nécessaire de le mettre en place : sans doute pas.

Est ce que le pass écrit en dur dans le script est suffisant : sans aucun doute oui.
Si quelqu'un parvient à lire le fichier PHP c'est de toute façon déjà trop tard (SSL compris) Dans certains cas il y a moyen de limiter un peu la casse en stockant ces données dans des fichiers séparés (qui seront inclus) mais bon, il vaut mieux travailler en amont.


Cordialement,



Kohntark -
Commenter la réponse de kohntark
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 15:31
0
Merci
@Cod57
NB : je n'avais pas vu ton dernier message avant de poster.
Cela ne remet pas en cause mes propos.



if(isset($_POST['pwd']) && $_POST['pwd']===$pass && $_SERVER['REQUEST_METHOD']==='POST' && $salt===$_POST['salt'] && $_POST['passfake']===$passfake){


> il ne s'agit que de données en clair qu'il est possible d'intercepter et de rejouer.
Le salt n'apporte rien de plus comme mentionné avant.
Même en hachant le nom du chien (le nom, pas le chien hein ^^) de Georges côté client avec un salt md5() de son numéro de sécu (en javascript) ça ne changerai rien du tout !

J'intercepte, je rejoue, je suis admin.

Cordialement,

Kohntark -
Commenter la réponse de kohntark
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 30 juil. 2011 à 15:58
0
Merci
@kohntark
completement d'accord le problème est là

- accès direct au fichier PHP (non interprété)


pour l'histoire du hack je sais que l'on peut contourner beaucoup de choses mais dans l'affaire qui concerne Georges il faudrait pas l'embrouiller je crois que la solution de base reste valide mais qu'il sépare form.php action -> identification.php ou utilise
une connection à une base

qu'il sépare un peu les fichiers là tout est reposté sur le même fichier donc on peut pas vraiment controler dans le temps faire par exemple un token avec uniqid ... et le mettre dans la session ... ou un captcha

47 avait repondu en realité j'aurai pas du parler du md5



Bonne programmation !
Commenter la réponse de cod57
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 16:38
0
Merci
Malheureusement cod57 quand je simule ta proposition
lorsque je suis dans ADMIN (calendrier_bo.php)et je veux changer de mois ex: juillet vers aout je reviens systématiquement vers le mot de passe!!!
si quelqu'un pouvait-m'aider?
MERCI
Commenter la réponse de Georges97427
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 30 juil. 2011 à 16:49
0
Merci
@cod57
Tout à fait, Georges gagnerait à simplifier et séparer un peu plus les choses.

Un dernier mot sur la sécurité de la communication client <=> serveur :
Il n'y a qu'une question à se poser :
Est ce que ma page d'admin nécessite une haute sécurité (accès à des numéros de CB, des dossiers médicaux, ...) ?
Oui ?
=> j'utilise une connexion SSL

Non ?
=> le mot de passe écrit en dur suffit très amplement.

Une des questions qui permet de répondre à la première :
Combien de temps un pirate est il prêt à passer pour accéder à mes données ?

Ce qui est par contre commun :
- la robustesse du mot de passe
- limiter si possible le nombre d'essais
- les trous béants de sécurité que l'on laisse à côté en se focalisant trop sur le password.
Je ne compte plus le nombre de fois où je vois des codes hallucinants qui utilisent SHA1() (parce "md5() c'est trop facile"), REMOTE_ADDR, cookies, SESSION, etc ... pour "sécuriser" le login, ... et 3 lignes après on trouve un beau
SELECT * FROM truc WHERE machin=$_POST['bidule']


@Georges
Après avoir jeté un oeil très rapide :
Tu alourdis et complexifies sensiblement ton code.

Je serai curieux de voir le contenu de fonctions.php

$mois_de_annee array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre");
> ça ne sert à rien !!

echo 'le mois en cours est '.strftime('%B');

Si ça ne te l'affiche pas en Français c'est que tu as un problème avec les locales.
Si la config serveur ne t'est pas accessible tu peux utiliser setlocale(LC_TIME, '[la locale qui va bien]')
(cf la doc)


$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an AND MONTH(jour) = $mois");

Et hop, une belle injection SQL en passant ce que l'on veut dans $_GET['mois'] !!

Il faut toujours vérifier les données provenant de l'utilisateur (je sais, en principe cette requête n'est exécutée que par l'admin, mais ça ne change rien)
Au minimum utilise mysql_real_escape_string()
Mais dans ce cas tu n'en as même pas besoin :
Tu attends un chiffre dans $_GET['mois'], tu dois donc t'en assurer et virer tout ce qui ne l'est pas.
Une façon de faire :

<?php
if($_GET['mois'] < 1 || $_GET['mois'] > 12) {
  //  => pas normal : tentative d'injection ou erreur qqpart dans les scripts
}
?>




<?php
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
?>

Inutile de "transtyper": false, comme true, sont et ne peuvent être que des booléens.

Et hop, 1 boucle en moins :
=> array_fill(0, 31, false);


<?php
$dernier_jour = 28;
    while (checkdate($mois, $dernier_jour + 1, $an)) {
        $dernier_jour++;
    }
?>

Et hop, 1 boucle en moins :
> $dernier_jour date('d', mktime(0, 0, 0, $mois+1, 0, $an));


Etc ...


Cordialement,

Kohntark-
Commenter la réponse de kohntark
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 22:59
0
Merci
Je comprends vos débat mais je cherche une "simple réponse" à une simple question.
Merci
Malheureusement je reviens TOUJOURS au mot de passe, mais rien ne fonctionne.
Je ne veux pas tout refaire...
Mon "ancienne solution" reste, pour l'instant, la plus fonctionnelle.
Ne pourrais-je pas avoir la modification qui fonctionne?

voilà le contenu de fonction.php.
<?php
// conversion de la date (aaa-mm-jj) en deux variables $mois (mm) et $an (aa)
function convertion($date){
// recupére les 2 caractére aprés le 5eme caractére de $ date (aaaa-mm-jj donne mm)
$mois = substr($date, 5, 2);
// recupére les 4 premiers caratéres de $ date (aaaa-mm-jj donne aaaa)
$an  = substr($date, 0, 4);
// on retourne un tableau contanant les deux variables
return array( $mois, $an);
}


// fonction permetant de retourner la date au format aaaa-mm-jj
function ajout_zero($jj, $mm, $aa){
// ajoute un 0 quand le jour ne contient pas de 0 et qu'il est inferieur à 10 (8 donne 08)
if($jj <= 9 && substr($jj, 0, 1)!= 0){
$jj  = '0'.$jj;
}	
// ajoute un 0 quand le mois ne contient pas de 0 et qu'il est inferieur à 10 (8 donne 08)
if($mm <= 9 && substr($mm, 0, 1)!= 0){
$mm  = '0'.$mm;
}
// on retourne le tout sous la forme aaaa-mm-jj
$retour = (string)$aa.'-'.$mm.'-'.$jj;
return $retour;
}

?>
Commenter la réponse de Georges97427
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 30 juil. 2011 à 23:00
0
Merci
Commenter la réponse de Georges97427
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 31 juil. 2011 à 07:08
0
Merci
Rebonjour,

A mes 2 interlocuteurs privilégiés.

Je ne suis pas à votre niveau d'où "débutant".
Merci de ne pas l'oublier! J'ai essayé vos solutions mais cela ne fonctionne pas.
Je voudrais seulement et seulement de vous les "spécialistes", la solution à mon problème du message 1.
Après logiquement j'avancerais petit à petit mais...je ne veux tout bousculer, je n'en ai pas le niveau.
Donc soyons concret et simple je réitère ma demande:
voilà votre solution (j'ai fait un copier/coller)
et en dessous ma "petite" solution. Merci de me corriger!!
Je reste toujours ouvert à vos solutions.

<?php
session_start();
$passfake=md5('Georges974fake'); //a personnaliser
$pass='Georges974'; //ce que tu veux
/* && et === sont plus strict au niveau du controle*/

if(isset($_POST['pwd']) && $_POST['pwd']===$pass && $_SERVER['REQUEST_METHOD']==='POST' && $_POST['passfake']===$passfake){
$_SESSION['admin']=true;
}else{
$_SESSION['admin']=false;
}

/*deconnection*/
if(isset($_GET['dec']) && $_GET['dec']==='medeconnecter'){
//session_start();
session_unset();
session_destroy();
header('Location: ?');exit;
}

if($_SESSION['admin']===true)
{

echo '[?dec=medeconnecter me deconnecter]
';

include("fonctions.php");
// recuperation du jour, mois, et annÚe actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et annÚe correspondent au mois et Ó l'annÚe courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois prÚcÚdent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'annÚe en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao¹t", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau Ó 31 entrÚe (1 pour chaues jours) et on dit qu'aucuns jours n'est resevÚ
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion Ó la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservÚ dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>
<!-- le html  ici -->
<html>
<head>
<title>index</title>
<link href="calendar.css" rel="stylesheet" type="text/css">
</head>




<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
[tarifs.php Retour Le paille-en-queue]



<!--[calendar.css 
</head>



<?php
include("fonctions.php");
// recuperation du jour, mois, et année actuels
$jour_actuel = date("j", time());
$mois_actuel = date("m", time());
$an_actuel = date("Y", time());
$jour = $jour_actuel;

// si la variable mois n'existe pas, mois et année correspondent au mois et à l'année courante
if(!isset($_GET["mois"]))
{
$mois = $mois_actuel;
$an = $an_actuel;
}
else
{
$mois = $_GET["mois"];
$an = $_GET["an"];
}
//mois suivant
$mois_suivant = $mois + 1;
$an_suivant = $an;
if ($mois_suivant == 13)
{
$mois_suivant = 1;
$an_suivant = $an + 1;
}

//mois précédent
$mois_prec = $mois - 1;
$an_prec = $an;
if ($mois_prec == 0)
{
$mois_prec = 12;
$an_prec = $an - 1;
}

//affichage du mois et de l'année en french
$mois_de_annee = array("Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Decembre");
$mois_en_clair = $mois_de_annee[$mois - 1];
// creation d'un tableau à 31 entrée (1 pour chaues jours) et on dit qu'aucuns jours n'est resevé
for($j = 1; $j < 32; $j++){
$tab_jours[$j] = (bool)false;
}
// connexion à la bdd
include("config.inc.php");
$connect = mysql_connect($hote, $user, $password);
mysql_select_db($base, $connect);

$requete mysql_query("SELECT * FROM calendrier WHERE YEAR(jour) $an	AND MONTH(jour) = $mois");
while ($ligne = mysql_fetch_array($requete)){
// recupartion du jour ou il y a la reservation
$jours = $ligne["jour"];
// transforme aaaa/mm/jj en jj
$jour_reserve = (int)substr($jours, 8, 2);
// insertion des jours reservé dans le tableau
$tab_jours[$jour_reserve] = (bool)true;	
}
mysql_close($connect);
?>



<table width="346" border="0" cellpadding="0" cellspacing="0">
----,
<?php echo $mois_en_clair,\" \", $an; ?>
</td>
]&an=<?php echo $an_prec; ?>">

,
[tarifs.php Retour Le paille-en-queue]




</html>
<?php
}
else
{
echo "
  <form action='calendrier_bo.php' method='post'>Entrez le mot de passe : </form>
    ";
}
?>
Commenter la réponse de Georges97427
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 31 juil. 2011 à 07:15
0
Merci
un oubli.
Cet exemple de calendrier dont je me suis largement inspiré, se trouve sur le site de PHPCS sous le nom de: calendrier_local_niconos_sag
Commenter la réponse de Georges97427
Georges97427 54 Messages postés mardi 28 juin 2011Date d'inscription 21 février 2013 Dernière intervention - 31 juil. 2011 à 09:10
0
Merci
voilà la correction en ligne 6 pour que ça fonctionne:
if(isset($_SESSION['admin']) && $_SESSION['admin'])

Si vous avez d'autres solutions je suis toujours prêt à les essayer...
Merci
Commenter la réponse de Georges97427

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.