#14797

Note : astuce sécurité PHP

MÀJ : voir les deux ÉDIT plus bas

Utilisez ça en haut de votre script PHP :

if ($_SERVER['PHP_SELF'] !== $_SERVER['SCRIPT_NAME']) {
	header('Location: '.$_SERVER['SCRIPT_NAME']);
}


Quand je vais sur la page "/index.php" ou sur la page "/" d’un répertoire, le contenu du fichier "index.php" est exécuté en PHP. Ceci est normal.
Par contre, quand je vais sur l’URL "/index.php/" (même chose, mais avec un slash à la fin) ou "/index.php/code_ici", alors Apache considère qu’on va dans un sous-répertoire (à cause du slash). Or, l’ouverture d’un répertoire constitue l’exécution de ce dernier (sous Unix/Linux). Du coup, le contenu de "index.php" est exécuté quand même, alors que pour n’importe quel autre fichier, ça aurait fait une erreur 404.

Le code PHP fonctionnera bien, mais tous les liens relatifs seront cassés, car apache considère qu’on a franchi un nouveau niveau de profondeur dans l’arborescence des fichiers.
Pire, quand on utilise le $_SERVER['PHP_SELF'] , ça contiendra le "/" et tout ce qui suit. Utilise le PHP_SELF est donc compromettant et peut devenir une faille XSS :
/index.php/%22onmouseover=prompt(971741)%3E



Ce que fait mon code : il compare le chemin du fichier actuellement exécuté (index.php) avec le chemin du fichier (index.php/). Si les deux sont différents, il y a un problème, et on renvoie sur (index.php).


ÉDIT :
Je viens de voir que certains serveurs, selon la config, retiraient directement tout ce qui suivait le "index.php". Mon code ci-dessus ne marche donc plus.
Du coup j’ai pondu ceci, qui a l’air de faire son job :

if (basename($_SERVER['SCRIPT_NAME']) === 'index.php' and strpos(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), 'index.php') === FALSE ) {
	$var_request_URI = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH).'index.php';
} else {
	$var_request_URI = $_SERVER['REQUEST_URI'];
}
if (parse_url($var_request_URI, PHP_URL_PATH) !== $_SERVER['SCRIPT_NAME']) {
	header('Location: '.$_SERVER['SCRIPT_NAME']);
}


Vous pouvez essayer sur mon site :
http://lehollandaisvolant.net/
http://lehollandaisvolant.net/index.php
http://lehollandaisvolant.net/index.php?parametre
http://lehollandaisvolant.net/index.php/
http://lehollandaisvolant.net/index.php/?param
http://lehollandaisvolant.net/index.php/codeIci
http://lehollandaisvolant.net/index.php/codeIci/?param

J’ai vu que le problème était présent sur Shaarli aussi : allez sur votre shaarli, allez sur la page "index.php" (qui n’est habituellement pas affichée, mais qui existe quand même) et ajoutez un "/" à la fin de l’URL.

RÉ-ÉDIT : voir là : http://lehollandaisvolant.net/?mode=links&id=20160330174432
http://lehollandaisvolant.net/?mode=links&id=20160319122329