Trucs et astuces PHP (II)

• Comment sécuriser l'upload de fichiers ?
• Comment générer du code javascript à la volée ?
• Comment vérifier un nom de domaine en PHP ?
• Comment retrouver le nom d'hôte correspondant à une adresse IP* ?
• Comment supprimer les antislashs d'une chaîne ?
• Comment échapper les caractères spéciaux dans un formulaire ?
• Comment supprimer un cookie appartenant à votre domaine ?
• Comment effectuer une redirection avec des paramètres ?
• Comment utiliser PHP en ligne de commande* ?
• Comment récupérer le nom d'utilisateur avec une authentification par htaccess* ?
• Comment supprimer l'extension d'un nom de fichier ?
• Comment afficher le résultat d'une requête SQL dans une liste déroulante ?
• Comment augmenter la durée de vie d'un script* ?
• Comment retrouver la valeur hexadécimale d'un caractère ?
• Comment retrouver le nom d'un fichier à partir du chemin complet ?
• Comment découper une chaîne avec différents délimiteurs ?
• Comment compléter une chaîne avec une autre chaîne ?
• Comment afficher la date de dernière modification d'un fichier ?
• Comment afficher le nuancier des 256 couleurs compatibles Web ?
• Comment décomposer les différentes parties d'une URL ?

L'astérisque (*) signale une solution dépendante de la configuration du serveur.

 

Comment sécuriser l'upload de fichiers ?

Exemple de code comportant des failles de sécurité :
<?
if(!$userfile && $userfile != "none") { //il peut s'agir d'une simple chaîne de caractères
   copy($userfile, $userfile_name);//risque d'écrasement et de déplacement de fichier n'importe où
}
?>
Le même code sécurisé :
<?
if(is_uploaded_file($userfile)) { //vérifie qu'il s'agit d'un fichier téléchargé et non d'une simple chaîne
   if(!file_exists("/upload/$userfile")) { //contrôle une tentative d'écrasement de fichier
      move_uploaded_file($userfile, "/upload");//déplace le fichier téléchargé 
// dans un répertoire protégé } ?>

Vous devez également contrôler le type et l'extension du fichier. Un script php (ou autre) peut contenir des commandes de suppression de fichiers !

A noter : l'upload de fichier n'est pas sécurisé avec php3.

 

Comment générer du code javascript à la volée ?

Crée un tableau javascript multi-dimensionnel à partir d'un tableau PHP également multi-dimensionnel :
<script language="JavaScript">
<!--
tab = new Array();
<?
$tab = array ("agrumes" => array (
                  "orange",
                  "pamplemousse",
                  "ananas")
                 ,"jours" => array (
                  "lundi",
                  "mardi",
                  "mercredi")
                 ,"mois" => array (
                  "janvier",
                  "février",
                  "mars")
);

while(list($k,$v) = each($tab)) {
   echo "tab['$k'] = new Array()\n";
   echo "tab['$k'][0] = '$v[0]'\n";
   echo "tab['$k'][1] = '$v[1]'\n";
   echo "tab['$k'][2] = '$v[2]'\n";
}
?>
//-->
</script> 

Affiche dans le code source de la page HTML :

<?
<script language="JavaScript">
<!--
tab = new Array();
tab['agrumes'] = new Array()
tab['agrumes'][0] = 'orange'
tab['agrumes'][1] = 'pamplemousse'
tab['agrumes'][2] = 'ananas'
tab['jours'] = new Array()
tab['jours'][0] = 'lundi'
tab['jours'][1] = 'mardi'
tab['jours'][2] = 'mercredi'
tab['mois'] = new Array()
tab['mois'][0] = 'janvier'
tab['mois'][1] = 'février'
tab['mois'][2] = 'mars'
//-->
</script> ?>

Crée un lien javascript :

<?
onClick="location.href='<? echo $HTTP_REFERER ?>'";
?>

 

Comment vérifier un nom de domaine en PHP ?

Il suffit d'ouvrir un socket sur le port 43 d'un serveur Whois ("Qui est-ce ?" en anglais) et de lui passer cette requête : "votre_nom_de_domaine", puis de lire le résultat ligne par ligne avec la fonction fgets, exactement comme on le ferait avec un fichier. Serveurs Whois : whois.networksolutions.com, whois.internic.fr, whois.afnic.fr...
<?
$fp = fsockopen($serveur, 43, $errno,$errstr, 10);
if (!$fp) {
	echo "$errstr ($errno)";
} else {
	fputs($fp, "php.net\r\n");
	while (!feof($fp)) {
		echo fgets($fp,10000);
	}
	fclose ($fp);
}
?>

Vous pouvez tester le programme complet ou le télécharger.

Comment retrouver le nom d'hôte correspondant à une adresse IP* ?

<? echo "Le nom d'hôte correspondant à votre adresse IP  $REMOTE_ADDR est : "
.gethostbyaddr($REMOTE_ADDR) ?>

Affiche : Le nom d'hôte correspondant à votre adresse IP 62.147.160.232 (nas-cbv-9-62-147-160-232.dial.proxad.net) est : nas-cbv-9-62-147-160-232.dial.proxad.net

 

Comment supprimer les antislashs d'une chaîne ?

PHP échappe systématiquement les caractères sensibles provenant des GPC (GetPostCookie) avec un antislash (\) pour des raisons de sécurité. Pour retrouver le texte d'origine, utilisez stripslashes() :
<?
$str = "\'\\\""; //équivalent d'une chaîne provenant des GPC
echo stripslashes ($str);
?>

Affiche : '\"

 

Comment échapper les caractères spéciaux dans un formulaire ?

Si le navigateur ne trouve pas la balise de fin >, il n'affichera pas le champ texte. C'est pourquoi il est nécessaire d'encoder les caractères qui ont une signification spéciale en HTML.. Même remarque pour ".
<input type="text" name="email" value="<? echo htmlspecialchars("<adresse@email>") ?>">

Affiche :

 

Comment supprimer un cookie appartenant à votre domaine ?


Il suffit de le remplacer par un autre de même nom, vide et avec une date passée. Vous ne pouvez pas supprimer un cookie envoyé par un autre domaine que le votre.

<?
setcookie ("session_id", md5 (uniqid (rand())), time()+3600); //cookie envoyé pour une session
// d'1 heure setcookie ("session_id", "",-1); //suppression du cookie de session ?>

Comment effectuer une redirection avec des paramètres ?


Les paramètres doivent être encodés. De plus, l'url doit être absolue, car certains navigateurs ne savent pas interpréter les redirections avec des urls relatives.

<?
$url = "http://".$SERVER_NAME
   ."/redirect.php?"
   . rawurlencode("nom=&prénom=");
header("location:$url");
exit;
?>

 

Comment utiliser PHP en ligne de commande ?


Vous pouvez utiliser PHP indépendamment du navigateur, par exemple si vous avez un script qui consomme beaucoup de ressources et que pour cette raison vous souhaitiez en faire une page HTML statique. Créez (sur Windows) un script batch (extension .bat) sur ce modèle :

@echo off
c:\php\php.exe -q c:\web\quotations.php > c:\web\quotations.html

L'option -q désactive l'envoi du type MIME (par défaut text/html, inutile ici puisque destiné au navigateur). Une page "quotations.html" sera créée dans le répertoire racine à partir du script "quotations.php". Notez que les variables d'environnement ne sont pas disponibles dans cette utilisation. De plus, PHP doit être exécutable.

Comment récupérer le nom d'utilisateur avec une authentification par htaccess* ?


Grâce à la variable d'environnement $PHP_AUTH_USER
Attendez-vous cependant à ce que sa soeur $PHP_AUTH_PW soit vide dans la plupart des cas pour d'évidentes raisons de sécurité.

 

Comment supprimer l'extension d'un nom de fichier ?


<?
$str = "image.jpg";
echo substr($str, 0, strrpos($str,"."));
?>

Affiche le nom du fichier sans l'extension : "image"

 

Comment afficher le résultat d'une requête SQL dans une liste déroulante ?


<?
mysql_connect("localhost","","");
mysql_select_db("le_nom_de_votre_base");
$result = mysql_query("SELECT * FROM test");

echo "<form><select name=\"result\">\n";
while($row = mysql_fetch_array($result)) {
   echo "<option value=\"".$row["id"]."\">".$row["fruit"]."</option>\n";
}
echo "</select></form>";
?>
Affiche :

 

Comment augmenter la durée de vie d'un script* ?


L'upload de fichier, l'envoi de mail en boucle, un transfert FTP prennent parfois plus de 30 secondes, qui est la durée de vie maximale d'un script par défaut. La fonction set_time_limit() permet de modifier cette valeur (exprimée en secondes). Est désactivée quand PHP est installé en safe_mode.

<?
set_time_limit(500); //fixe un délai maximum d'exécution de 500 secondes soit 3 minutes.
?>

 

Comment retrouver la valeur hexadécimale d'un caractère ?


<?
echo dechex(ord("a")); //encode tous les caractères
echo str_replace("%","",rawurlencode("é@")); //encode seulement les caractères spéciaux
?>

 

Comment retrouver le nom d'un fichier à partir du chemin complet ?


<?
echo basename("/chemin/complet/du/fichier.php"); ?>

Affiche : fichier.php

 

Comment découper une chaîne avec différents délimiteurs ?

.

<?
$str = "chaîne à découper, suivant la ponctuation";
$part = strtok($str," ");
while ($part) {
   echo $part,"<br>";
   $part = strtok(",");
}
?>

Affiche :
chaîne
à découper
suivant la ponctuation

 

Comment compléter une chaîne avec une autre chaîne ?


<?
$card_number = substr("0123456789",0,6);
echo str_pad($card_number,10,"*");
?>
Affiche : 012345****

 

Comment afficher la date de dernière modification d'un fichier ?


<?
echo "Modifié le : ".date("d/m/Y",filemtime("index.php"));
?>

Affiche : Modifié le : 22/01/2002

 

Comment afficher le nuancier des 256 couleurs compatibles Web ?


<?
$couleur = array("00", "33", "66", "99", "CC", "FF");
for($rouge = 0; $rouge < count($couleur); $rouge++)
{
   echo "<TABLE>\n";
   for($vert = 0; $vert < count($couleur); $vert++)
   {
      echo "<TR>\n";
      for($bleu = 0; $bleu < count($couleur); $bleu++)
      {
         $Cellcouleur = $couleur[$rouge] . 
            $couleur[$vert] . $couleur[$bleu];

         echo "<TD BGCOLOR=\"#$Cellcouleur\">";
         echo "<TT>$Cellcouleur</TT>";
         echo "</TD>\n";      
      }   

      echo "</TR>\n";
   }   
   echo "</TABLE>\n";
}
?>
000000 000033 000066 000099 0000CC 0000FF
003300 003333 003366 003399 0033CC 0033FF
006600 006633 006666 006699 0066CC 0066FF
009900 009933 009966 009999 0099CC 0099FF
00CC00 00CC33 00CC66 00CC99 00CCCC 00CCFF
00FF00 00FF33 00FF66 00FF99 00FFCC 00FFFF
330000 330033 330066 330099 3300CC 3300FF
333300 333333 333366 333399 3333CC 3333FF
336600 336633 336666 336699 3366CC 3366FF
339900 339933 339966 339999 3399CC 3399FF
33CC00 33CC33 33CC66 33CC99 33CCCC 33CCFF
33FF00 33FF33 33FF66 33FF99 33FFCC 33FFFF
660000 660033 660066 660099 6600CC 6600FF
663300 663333 663366 663399 6633CC 6633FF
666600 666633 666666 666699 6666CC 6666FF
669900 669933 669966 669999 6699CC 6699FF
66CC00 66CC33 66CC66 66CC99 66CCCC 66CCFF
66FF00 66FF33 66FF66 66FF99 66FFCC 66FFFF
990000 990033 990066 990099 9900CC 9900FF
993300 993333 993366 993399 9933CC 9933FF
996600 996633 996666 996699 9966CC 9966FF
999900 999933 999966 999999 9999CC 9999FF
99CC00 99CC33 99CC66 99CC99 99CCCC 99CCFF
99FF00 99FF33 99FF66 99FF99 99FFCC 99FFFF
CC0000 CC0033 CC0066 CC0099 CC00CC CC00FF
CC3300 CC3333 CC3366 CC3399 CC33CC CC33FF
CC6600 CC6633 CC6666 CC6699 CC66CC CC66FF
CC9900 CC9933 CC9966 CC9999 CC99CC CC99FF
CCCC00 CCCC33 CCCC66 CCCC99 CCCCCC CCCCFF
CCFF00 CCFF33 CCFF66 CCFF99 CCFFCC CCFFFF
FF0000 FF0033 FF0066 FF0099 FF00CC FF00FF
FF3300 FF3333 FF3366 FF3399 FF33CC FF33FF
FF6600 FF6633 FF6666 FF6699 FF66CC FF66FF
FF9900 FF9933 FF9966 FF9999 FF99CC FF99FF
FFCC00 FFCC33 FFCC66 FFCC99 FFCCCC FFCCFF
FFFF00 FFFF33 FFFF66 FFFF99 FFFFCC FFFFFF

 

Comment décomposer les différentes parties d'une URL ?


<?
$url = parse_url("http://www.php.net/downloads.php");
foreach($url as $v)
   echo $v,"<br>";
?>

Affiche :
http
www.php.net
/downloads.php