Tous les billets étiquettés / PHP

php.ini : forcer des options spécifiques pour chaque site

Petit truc très utile si jamais vous disposiez d’un serveur mutualisé hébergeant plusieurs sites et que vous souhaitiez – par exemple – augmenter le POST_MAX_SIZE pour un de vos clients afin de lui permettre de téléverser des photos de haute qualité via l’admin de WordPress.

À la racine de votre dossier public, ajoutez un .htaccess contenant :

suPHP_ConfigPath /home/public_html/

et au même endroit, un fichier nommé php.ini contenant les configs à surpasser (override), par exemple:

upload_max_filesize=10M
post_max_size=10M
max_execution_time=200
max_input_time=200

MÀJ : Merci au collègue Éric qui me souligne au passage la nécessité d’avoir installé le module suPHP pour que cette astuce fonctionne.


Mise en cache de pages dynamiques

Voici un petit tutoriel pour expliquer comment – très simplement – mettre une page dynamique en cache pour en accélérer l’affichage et limiter les ressources côté serveur (apache et mysql).

Premièrement, suffit de créer deux fonctions. La première – debut_cache() – testera l’existence d’un fichier cache récent pour l’affichier, ou initialisera le buffer et débutera la mise en cache du contenu. La deuxième – fin_cache() – prend le contenu mis dans le buffer et va, suivant le besoin, écrire un fichier statique avec le contenu généré par le serveur qui sera alors repris par les requêtes suivants jusqu’à son expiration.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function debut_cache() 
{
	global $cachedFile;
	if(CACHE > 0) {
		if (!isset($_POST) || count($_POST) == 0) {
			$hash = md5(serialize($_GET) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
			$filename = basename($_SERVER['PHP_SELF'] . '.' . $_SERVER['HTTP_HOST'] . '.' . $hash . '.html');
			if (file_exists(CACHE_DIR . $filename) AND (time() - filemtime(CACHE_DIR. $filename)) < CACHE) {
				readfile(CACHE_DIR . $filename);
				exit();
			} else {
				$cachedFile = CACHE_DIR . $filename;
				ob_start();
			}
		} else $cachedFile = false;
	}
}
   
function fin_cache() 
{
	global $cachedFile;
	if((CACHE > 0) AND $cachedFile) {	
		$hoststr= getenv("HOSTNAME");
		$host = explode (".", $hoststr);
		$page = ob_get_contents();
		$page .= '<!-- Page mise en cache @ ' . date('Y-m-d H:i:s') . ' -->';
		ob_end_flush();	
		if ($file = fopen($cachedFile, 'w')) {
    			fwrite($file, $page);
    			fclose($file);
    		}		
	}
}

Juste avant de faire l’appel, il importe de définir deux variables (des constantes globales dans cet exemple).

1
2
3
4
5
//temps pour le cache (secondes)... 0 pour annuler la cache
define('CACHE', 60*15);  //15 min

//dossier de cache
define('CACHE_DIR', '/www/cache/');

Ensuite, on se lance :

1
2
3
4
5
6
7
8
9
10
//lancer la mise en cache
debut_cache();
 
//---------------------------------------------
//afficher normalement votre page ici
//elle sera mise dans le buffer
//---------------------------------------------

//afficher le contenu (du buffer ou du fichier mis en cache)
fin_cache();

Créer une page PHP personnalisée dans l’environnement de WordPress

Un petit truc d’apparence bien simple : comment créer une page PHP personnalisée permettant quand même d’accéder à toutes les variables et fonctions propres à l’environnement de notre blogue WordPress. La réponse?

Créer une page dans votre dossier de thème :

/wp-content/themes/nom-du-theme/page.php

Au tout début de cette page, insérez les instructions suivantes :

1
2
3
4
5
6
<?php
	define('WP_USE_THEMES', false); 
	//chemin relatif à la racine de votre blogue
	//on ne peut pas utiliser les variables de WP, donc on y va manuellement
	require('../../../wp-blog-header.php');
?>

Vous pourrez donc utiliser toutes les fonctions propres à WordPress (principalement le loop) dans votre page sur mesure.

Notez que pour des raisons esthétiques, ça pourrait être bien de songer à embellir l’URL d’accès à cette page grâce à MOD_REWRITE et votre fichier .htaccess.


Protéger la fonction mail() des injections d’en-têtes

Vous avez développé un formulaire d’envoi par courriel utilisant la fonction mail()? Si oui, avez-vous pensé à vous protéger des injections d’en-têtes, lesquelles peuvent faire de votre beau petit script de 10 lignes un relai de spam considérable? Non? Qu’attendez-vous?

Comment les spammers s’y prennent?

Très simple! Il ne font qu’entrer un truc du genre dans un champ de votre formulaire :

1
email@domaine.com n CC: spam1@domaine.com, spam2@domaine.com...

Les en-têtes e-mail étant très sensibles, elles considèrent le saut de ligne (r) ou les nouvelles lignes (n) explicites comme le début d’une nouvelle directive (ici, l’insertion d’une liste d’adresses en copie-conforme). Voyez une multitude d’exploit ici.

Comment s’en protéger?

Encore une fois, rien de plus facile. Dans votre validation, vous n’avez qu’à y aller d’une petite expression régulière sur les champs soumis :

1
2
if ( eregi("(r|n)", $_GET['nom']) || eregi("(r|n)", $_GET['email']) )
	exit("Va-t'en, spammer!");

N’oubliez pas de traiter chacun des champs qui sont utilisés dans la construction des en-têtes (nom, courriel, format, charset, etc.) de votre message.