Proteger son include avec un mot de passe

Résolu/Fermé
Baltazarius - 10 mai 2009 à 19:46
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 - 12 mai 2009 à 21:35
Bonsoir,

Comme je veux créer des comptes sur mon site, je voudrais protéger mes pages. Le soucis c'est que je n'arrive pas à protéger mes pages inclue dans un dossier. Quand je met un htacces et que j'entre par exemple cette adresse: http://monsite.fr/index.php?page=administration j'y ai toujours accès ! Par contre lorsque j'entre l'adresse directement à la page qui se trouve dans le dossier censé être protégé j'ai bien la protection.

Mon système d'include ce fais de cette manière:
<?php

$p=$_GET['p'];
switch ($p) {
case 'administration': include('admin/index.php'); break;

default: include('includes/erreur.php');
}
?>
Voilà j'espère que vous allez pouvoir m'éclairer. En tout cas merci de votre lecture.
A voir également:

13 réponses

Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 13:23
Bonjour,

Tu as mis le doigt en plein sur LA faille include. Il faut comprendre comment marche le .htaccess. En fait, il intervient directement au niveau du serveur Apache. Apache, c'est le programme qui envoie les pages au navigateur du visiteur. Avec ton .htaccess, Apache n'enverra pas la page au visiteur. Par contre, PHP, qui est éxécuté dans ta page index.php n'a aucune restriction. Ce n'est donc pas le visiteur qui va chercher la page bloquée, mais PHP. Apache envoie ensuite la page index.php remplie avec le contenu. Le problème donc, empécher l'accès des pages non désirées à PHP.
Par contre, au vu de ton code, je ne vois pas vraiment ton soucis, puisque tu semble vouloir inclure cette page. Ca marche donc. Par contre, dans ton cas, il semble que tu inclues la variable $_GET['page'] aussi dans ton code.

Qu'est ce que tu veux faire éxactement? Que fait ton code actuel?
3
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 20:45
Ok. J'ai pas tout potassé, mais grosso modo, là ou je voulais en venir, ça y est =).
Les variables de session, tu connais? Si tu ne connais pas, alors va faire un tour sur le site du zéro: https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/913348-variables-superglobales#ss_part_2

Une fois que tu as compris, tu choisis une variable de session qui n'existe que si l'utilisateur est connecté, ou si c'est toi (il y en a plusieurs, prend celle que tu veux). Ensuite, il te suffit de tester si elle existe ou non (ce qui reviendra à tester si l'utlisateur est connecté ou non). Pour ça, je te conseille la documentation php, et la fonction "isset" : https://www.php.net/isset

Pour ce qui est sécurisation, il faudra qu'on en parle en pv, puisqu'il est interdit de parler des techniques d'attaque ici. Mais je me tiendrais à ta disposition.
1
Baltazarius
11 mai 2009 à 18:51
Bonsoir, merci cette réponse m'aide énormément à comprendre comment marche htacces et le serveur Apache.

(Effectivement je me suis trompé dans l'adresse, ce n'est pas "page" mais bien "p" de cette sorte: http://monsite.fr/index.php?p=administration)
Je souhaite sécuriser l'accès à une page tant bien que pars l'accès au dossier directe, tant que par l'accès à mon "include". A ce moment là il vaut peut être mieux créer une page de connexion traité directement par le php, ou bien les deux, ou encore autrement ?

Si c'est le cas, j'ose espérer que vous m'orientiez vers un tuto, ou vous même m'expliquiez la façon la plus sécuriser possible de créer des comptes en php.
J'ai cherché comment sécuriser une page avec du php mais j'ai peur que ça soit beaucoup trop facilement "crackable".

Je vous en remercie.
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 19:30
Au vu de ton code pourtant, il semble que tu veuille donner l'accès à cette page via l'include. Ou alors, tu veux que seulement certains utilisateurs y aient accès? Dans tous les cas, garde TOUJOURS la méthode du switch sur un include. Ca te permet de gérer individuellement chaque éventualité prévue. Alors dans un premier temps, on va faire fonctionner ça. Ensuite, on passera à la sécurisation. Donc par qui, et comment ta page doit-elle être accessible? Et donne la source complète de la page s'il te plait. (Par contre, tu as des balises "code" à coté des balises de mise en forme du texte quand tu poste sur le forum, pour que ça soit plus lisible.
(Faut qu'on règle ça ce soir, sinon ça remet ça à demain soir.. pas possible demain dans la journée)
0
Baltazarius
11 mai 2009 à 20:25
Bonsoir, merci de m'aider !Je ne vois pas comment on peut (par include) donner l'accès publique/privé ? En tout cas je veux que la page soit accessible par des membres inscrit ou moi enfin peu importe il faut seulement qu'elle soit protégé par mot de passe et login.

PS: le pun root c'est pour un forum PUNBB que j'utilise à partir de ma page pour se connecter directement ..
MERCI !

<?php session_start();
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
require_once('includes/config.php');
mysql_connect($serveur_mysql, $user_mysql, $pass_mysql);
mysql_select_db($bdd_mysql);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<title>mon site</title>
<meta name="Description" content="mon site"/>
<meta name="Keywords" content="mon site"/>
<meta name="Author" content="moi"/>
<meta name="Copyright" content="mon site"/>
<meta name="Content-language" content="fr"/>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1;" />
<link rel="stylesheet" type="text/css" href="style/style.css" />
<script type="text/javascript" src="/java/nextlan.js"></script>
</head>
<body onLoad="disp_delai()">
	<div id="header">
    	<div id="header_title">
			</div>


    <table width="100%" cellpadding="0" cellspacing="0">
    <tr>
        <td width="140px" valign="top">
            <div id="left">
                <?php
				if($pun_user['username'] == "" or $pun_user['username'] == "Guest"){
				echo "<div id=\"login\">";
				?>
                <form method="post" action="forum/login.php?action=in">
                	<input type="hidden" name="form_sent" value="1" />
					<input type="hidden" name="redirect_url" value="../index.php" />
                    <input type="text" name="req_username" id="login_form" />
                    <input type="password" name="req_password" id="password" />
                    <input type="submit" id="submit" value="Se connecter" />
                </form>
                <?php
				}elseif($pun_user['username'] != "Guest"){
				echo "<div id=\"logged\">";
				echo "<strong>Bonjour ".$pun_user['username'];
				echo "<br />Derni&egrave;re visite le<br />".date("d M Y - H:i:s",$pun_user['last_visit'])."</strong>";
				echo "<br /><a id=\"logged\" href=\"forum/login.php?action=out&id=".$pun_user['id']."\">D&eacute;connexion</a>";
				}
				?>
                </div>
                <div id="navigation">
                <br />
                <?php
				$retour = mysql_query('SELECT * FROM navigation');
				$donnees = mysql_fetch_array($retour);
				echo stripslashes($donnees['value']);
                ?>
                </div>
            </div>
        </td>
        <td align="center" valign="top">
            <div id="center">
            <?php if(!isset($_GET['p'])){ ?>
				<table width="100%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td><div id="last_news"><br /><br /><br />
                    	<?php $retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 9');
								while ($donnees = mysql_fetch_array($retour))
								{
								echo "<a id=\"logged\" href=\"index.php?p=news&id=".$donnees['id']."\">".nl2br(stripslashes($donnees['titre']))."</a><br />";
								}
                        ?>
                        </div></td>
                        <td><img src="images/lans_01.png" width="35" height="209" alt="" /></td>
                        <td style="background-image:url('images/lans_02.png');" height="209" width="100%"><div id="cadre_haut"><?php include('includes/cadre_haut.php'); ?></div></td>
                        <td><img src="images/lans_04.png" width="34" height="209" alt="" /></td>
                    </tr>
                </table>
                <table width="100%" style="height:100%;" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td>
                            <img src="images/content_01.png" width="45" height="28" alt="" /></td>
                        <td style="background-image:url('images/content_02.png');" width="100%"></td>
                        <td colspan="2">
                            <img src="images/content_03.png" width="34" height="28" alt="" /></td>
                    </tr>
                    <tr>
                        <td style="background-image:url('images/content_04.png');" height="100%"></td>
                        <td style="background-image:url('images/content_05.png');" width="100%">
							<div align="center">
                            	<img src="images/news.png" alt="" />
                                <!-- Script de news -->
                                <?php
								$retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 4');
								while ($donnees = mysql_fetch_array($retour))
								{
								?>
								<h3>
										<?php echo nl2br(stripslashes($donnees['titre']));?>
								</h3>
								<p>
									<?php
									$contenu = nl2br(stripslashes($donnees['contenu']));
									echo $contenu."<br /><br /><em>Ecrit par <font color=\"red\">".$donnees['auteur']."</font> le ".date('d/m/Y', $donnees['timestamp'])."</em>";
									?>
								</p>
								<hr />
								<?php
								}
								?>
                                <!-- Fin Script de news -->                  
					        </div>
                         </td>
                        <td style="background-image:url('images/content_06.png');" width="34" height="100%"></td>
                    </tr>
                    <tr>
                        <td>
                            <img src="images/content_08.png" width="45" height="33" alt="" /></td>
                        <td style="background-image:url('images/content_09.png');" width="100%"></td>
                        <td colspan="2">
                            <img src="images/content_10.png" width="34" height="33" alt="" /></td>
                    </tr>
                </table>
                <?php } else{ ?>
                <table width="100%" border="0" cellpadding="0" cellspacing="0">
                	<tr>
                        <td>
                            <img src="images/content-01.png" width="45" height="44" alt="" /></td>
                        <td style="background-image:url('images/content-04.png');" width="100%"></td>
                        <td colspan="2">
                            <img src="images/content-03.png" width="34" height="44" alt="" /></td>
                    </tr>
                    <tr>
                        <td style="background-image:url('images/content_04.png');" height="100%"></td>
                        <td style="background-image:url('images/content_05.png');" width="100%">
							<div align="center">
                            	<!-- Include -->
								<?php

$p=$_GET['p'];
switch ($p) {
 case 'news': include('includes/news.php'); break;
 case 'administration': include('includes/admin/index.php'); break;

 default: include('includes/erreur.php');
}
?>                    <!-- Include -->
					        </div>
                         </td>
                        <td style="background-image:url('images/content_06.png');" height="100%"></td>
                    </tr>
                    <tr>
                        <td>
                            <img src="images/content_08.png" width="45" height="33" alt="" /></td>
                        <td style="background-image:url('images/content_09.png');" width="100%"></td>
                        <td colspan="2">
                             <img src="images/content_10.png" width="34" height="33" alt="" /></td>
                    </tr>
                </table>
                <?php } ?>
			   </div>
				
			<table width="100%" cellpadding="0" cellspacing="0">
				<td width="right" valign="top">
					<div id="right">				
					<div id="pub">
					<br />
					<?php
					$retour = mysql_query("SELECT * FROM pub") or die ("Pb requette:  ".mysql_error());
					$donnees = mysql_fetch_array($retour);
					echo stripslashes($donnees['value']);
						?>
						</div>
			</table>
    	</td>
     </tr>
     </table>
</body>
</html>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Baltazarius
11 mai 2009 à 20:58
Merci, pour ça je vais m'inscrire.

Je suis en train de suivre le tuto du site du zero que vous m'avez passé.
Si j'ai bien compris il va falloir que j'insère dans ma variable ma page ?
comme ça ? $_SESSION['login&pwd'] = 'le contenu';
Je ne vois pas bien comment y venir autrement ?
Merci.
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 21:04
Ow mais je viens de voir.. Le code est de toi? Parce que l'array $pun_user n'est pas défini, a moins que ta page soit inclue? Et a quoi sert le "session_start() ?
0
Baltazarius
11 mai 2009 à 21:11
Oui, mon pun user me sert seulement pour PunBB( les forums gratuit). Et le pun user c'est une session enfaite je connais les sessions ^^ désolé.
Cette session est faite pour le forum punBB comme ça de la page d'accueil je peux me connecter à mon forum.
Mais ça ce n'est pas important ...
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 21:13
Ok... Je vois, et les users qui auront accès a ta page seront connectés aussi à la base de donnée du forum?
0
Baltazarius
11 mai 2009 à 21:39
je suppose que ça risque d'être trop compliqué. Quoi que, en reprenant les mêmes variables ça doit être faisable non ? =)
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 21:47
Et oui! Un exemple simple. A chaque début de page, tu teste par exemple la variable $_SESSION['id']
<?php
  if (isset($_SESSION['id'])) { $connected = true; } else { $connected = false; }
?>

Bien sur, si la personne est pas connectée, $connected sera false, mais si tes variables de session sont définies, alors $connected sera true.
Il suffit juste de reprendre les variables du forum, et de garder des session_start() sur toutes tes pages =)
0
Baltazarius
11 mai 2009 à 21:56
Merci, oui je n'avais pas vu ça comme ça !
Mais à ce moment là comment on peut donner des niveau de droit. Administrateur Moderateur ? Je dois créer une variable à chaque fois ?
id_admin id_mod ?

MErci
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
11 mai 2009 à 22:05
Une variable de session qui reprend le niveau =) (pour ça faut que tu fouille dans les sources du forum, ça existe déjà, puisque les modérateurs ont pas les mêmes droit que les admin :p )
Je sais pas comment c'est fait exactement, mais c'est dedans, c'est sur =)
0
Baltazarius
11 mai 2009 à 22:29
OKi merci je vais me coucher, en tout cas merci grandement de ton aide.
Bonne soirée et je finirais un peu plus tard =)
0
Baltazarius
12 mai 2009 à 19:00
Bonsoir! Alors merci je vois comment faire mais je bute bêtement ( surement ) sur ce problème:

Alors je met ma page d'administration:

<?php
session_start();
 
  if (isset($_SESSION['id'])) { $connected = true; ?>
<p>Le contenu</p>
 <?php } else { $connected = false; ?>
<p>Vous devez être connecté pour pouvoir accéder à cette page !</p>
 <?php
 }

?>


Mais je ne vois pas comment récupérer ma variable ID ?
Merco
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
12 mai 2009 à 19:08
Je ferais plutôt comme j'avais dis, dans un premier temps, la valeur de la variable $connected, et dans un second temps
<?php 
   if ($connected)
      {
          echo "contenu de la page";
      }
   else
      {
          echo "vous devez être connecté";
      }
?>

Mais c'est une question de façon de faire après, ça reste correct. Pour que ta variable $_SESSION['id'] soit initialisée, il suffit de lui donner une valeur lors de la connection. Normalement, c'est l'id du membre dans la base de donnée du forum.
0
Baltazarius
12 mai 2009 à 21:22
Wouaw, Merci bcp je m'éclate, rien de plus fabuleux que les $_session enfaite, j'avais pas vu ça comme ça !
Merci, j'ai réussis à protéger toute mes pages comme ça.
Je vous recontacte bientôt pour parler plus sérieusement de la sécurité :p
Merci vraiment !
Bonne soirée.
0
Apatik Messages postés 5304 Date d'inscription mercredi 28 janvier 2009 Statut Contributeur Dernière intervention 29 mai 2016 782
12 mai 2009 à 21:35
Marque le sujet comme résolu, et contacte moi en mp a ce sujet =)
0