Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

SVP Urgent : 3 questions concretes sur la securite PHP, readfile() et les tests de validation.

24 réponses
Avatar
Adrieno
Bonjour à tous,

Je suis en train de développer une application en PHP XML ET FLASH.

Concrètement, c'est un lecteur de mp3 en streaming. (Le
téléchargement de mp3 n'est pas permis). Ce sont des fichiers
relativement petits ( 40 sec / 200 Ko en moyenne)

La liste des fichiers (la playlist) qui s'affiche sur mon Appli flash
est définie dans un fichier xml qui est de la forme :


<?xml version="1.0" encoding="UTF-8"?>
<song>
<title>Musique_techno</title>
<file>envoyer_mp3.php?id=1</file>
</song>

<song>
<title>Musique_jazz</title>
<file>envoyer_mp3.php?id=2</file>
</song>

La page envoyer_mp3.php se charge de renvoyer le fichier mp3 demandé
en header.
En voici un extrait :

//le repertoire 'protect' est sécurisé coté serveur à l'aide d'un
htaccess.
if ($_GET['id']==2) $filename="protect/jazz.mp3";

header('Content-Type: audio/mpeg', true);
header('Content-Length: ' . filesize($filename), true);
readfile($filename);
exit;


A partir de la j'ai 3 questions très concrètes, votre aide me sera
TRES utile :

1. L'utilisateur mal intentionné qui edite le fichier xml et copie le
lien et colle sur sa barre d'adresse :
"www.monsite.com/envoyer_mp3.php?id=2" peut récuperer le fichier mp3
puisqu'il est envoyé en header. Comment contourner cette faille ?
J'ai pensé à tester le HTTP_REFERER mais, il n'y a jamais de
HTTP_REFERER, que l'on appelle le script à partir du fichier xml ou à
partir de la barre d'adresse ca change rien. Donc je ne sais pas
comment contourner une telle faille ...

2. J'utilise ici, pour lire mes fichiers mp3, la fonction readfile().
Est ce que cette fonction est "gourmande" en ressources serveur ? (il
est question qu'il y ait plusieurs dizaines d'utilisateurs en même
temps. Les fichiers étant relativement légers)
J'ai vu qu'il y avait d'autres fonctions equivalentes comme freads(),
ou fpassthru(), sont elles plus "efficaces" ? Laquelle est optimisé
pour cette utilisation ? Pourquoi ?

Et enfin :

3. Comment fait on pour tester une application avant mise en ligne ?
L'idée est simuler un environnement de connections multiples
(plusieurs dizaines) à cette application afin d'en tester la
résistance.
En fait, j'aimerai m'assurer de la stabilité de l'application avant
mise en ligne. Savoir par exemple, jusqu'à combien d'utilisateurs
peuvent se connecter simultanément. Je voudrais également m'assurer
qu'il n'y a pas de bug annexes au delà d'un certain de connectés...
Si vous avez des idées, elles sont les bienvenues !!!


MERCI INFINIMENT !!!!

10 réponses

1 2 3
Avatar
Cedric Blancher
Le Mon, 06 Jun 2005 14:33:21 +0000, Adrieno a écrit :
//le repertoire 'protect' est sécurisé coté serveur à l'aide d'un
htaccess.
if ($_GET['id']==2) $filename="protect/jazz.mp3";
header('Content-Type: audio/mpeg', true);
header('Content-Length: ' . filesize($filename), true);
readfile($filename);
exit;


Dans la mesure où tu accède à ton fichier par readfile(), tu n'as pas
besoin de le mettre dans un répertoire accessible par l'utilisateur.
Typiquement, le mettre en dessous de la racine de publication règle le
problème.
Mais ton hébergeur ne te laisse peut-être pas le choix...


--
Fernand l'emmerdeur, Fernand le malhonnête!.. c'est comme ça que j'l'appelle,
moi!..
-+- Bernard Blier, les Tontons Flingueurs

Avatar
Guillaume Bouchard
Adrieno wrote:
Bonjour à tous,


Bonjour.

La liste des fichiers (la playlist) qui s'affiche sur mon Appli flash
est définie dans un fichier xml qui est de la forme :


<?xml version="1.0" encoding="UTF-8"?>
<song>
<title>Musique_techno</title>
<file>envoyer_mp3.php?id=1</file>
</song>

<song>
<title>Musique_jazz</title>
<file>envoyer_mp3.php?id=2</file>
</song>


Pourquoi ne pas faire seulement <file>2</file> ? Tu y gagnerais en
transfert client-server...

La page envoyer_mp3.php se charge de renvoyer le fichier mp3 demandé
en header.
En voici un extrait :

//le repertoire 'protect' est sécurisé coté serveur à l'aide d'un
htaccess.
if ($_GET['id']==2) $filename="protect/jazz.mp3";


Rassure moi, il s'agit d'un exemple et tu as implanter cela differament
du style

$music = array(1 => 'techno.mp3','jazz.mp3');

...
$file = 'protect/'.$music[$_GET['id']]; ?


header('Content-Type: audio/mpeg', true);
header('Content-Length: ' . filesize($filename), true);
readfile($filename);
exit;


Rien à dire.

A partir de la j'ai 3 questions très concrètes, votre aide me sera
TRES utile :

1. L'utilisateur mal intentionné qui edite le fichier xml et copie le
lien et colle sur sa barre d'adresse :
"www.monsite.com/envoyer_mp3.php?id=2" peut récuperer le fichier mp3
puisqu'il est envoyé en header. Comment contourner cette faille ?


Tu ne peux pas ! À partir du moment ou le fichier transite par http, il
n'y a aucun moyen (sauf changer de technologie) d'empecher l'utilisateur
de recuperer le fichier.


2. J'utilise ici, pour lire mes fichiers mp3, la fonction readfile().
Est ce que cette fonction est "gourmande" en ressources serveur ?

J'ai vu qu'il y avait d'autres fonctions equivalentes comme freads(),
ou fpassthru(), sont elles plus "efficaces" ?


Aucune idee. À tout hasard, pose la question sur fr.comp.lang.php où les
gens seront plus à même de te repondre AMHA.

Désolé pour cette reponse incomplete.

--
Guillaume.

Avatar
Fabien LE LEZ
On 06 Jun 2005 14:36:55 GMT, Cedric Blancher
:

Typiquement, le mettre en dessous de la racine de publication règle le
problème.


Si ce n'est pas possible, un simple .htaccess devrait aider.

À noter qu'il est très difficile d'interdire le téléchargement d'un
fichier, i.e. forcer le streaming. Même un vrai serveur de streaming
(style Real Video) ne résiste pas à Net Transport.

Avatar
(¯`·..Yttrium ...·?¯)
"Cedric Blancher" a écrit dans le message de
news:

Dans la mesure où tu accède à ton fichier par readfile(), tu n'as pas
besoin de le mettre dans un répertoire accessible par l'utilisateur.
Typiquement, le mettre en dessous de la racine de publication règle le
problème.
Mais ton hébergeur ne te laisse peut-être pas le choix...


Bonjour,

Certes certes, mais dans le cas présent , cela reglera t il vraiment le
probleme ?
Quelque soit l'empacement du fichier, si c'est le script qui l'appelle , et
que ce dernier est appellé à la main, le probleme restera le même..
Sauf erreur de ma part bien sur..

Il y a eu un thread trés interressant à ce sujet, mais je ne parviens poas à
le retrouver..

Salutations.

Avatar
Cedric Blancher
Le Mon, 06 Jun 2005 15:40:47 +0000, (¯`·..Yttrium ...·?¯) a écrit :
Certes certes, mais dans le cas présent , cela reglera t il vraiment le
probleme ?


Tu remarqueras que je ne réponds pas à la question du download des
fichiers directement en tapant le script, parce que le problème, c'est le
design du système. On n'a pas un problème d'implémentation, mais un
vrai problème structurel.

Se dire "je ne veux pas que le mecs puissent taper directement un URL pour
accéder aux mp3s" et les rendre accessibles à travers une applet Flash
qui récupère la liste en XML (qui doit aussi venir d'une URL), c'est
clairement contradictoire...

Il faut revoir le design, et concentrer son application sur le côté
serveur. Flash, c'est bien pour faire des mickeys qui font coin-coin en
dansant la polka, mais pas plus, parce que ça tourne sur le client. Il
suffit de voir par exemple comment les gars de Yeti Sports se sont fait
chier, en vain, pour pas se faire polluer leurs tableau de score, et sont
passé à autre chose (enregistrement obligatoire)...


--
BOFH excuse #319:

Your computer hasn't been returning all the bits it gets from the Internet.

Avatar
gomor-usenet
[..]
//le repertoire 'protect' est sécurisé coté serveur à l'aide d'un
htaccess.
if ($_GET['id']==2) $filename="protect/jazz.mp3";

header('Content-Type: audio/mpeg', true);
header('Content-Length: ' . filesize($filename), true);
readfile($filename);
exit;
[..]


Y'a pas une faille plus grave là ? attention, je ne suis pas un
expert en PHP.

Si php.ini est configuré en register_globals = yes, en passant une
url
du genre:

www.monsite.com/envoyer_mp3.php?id=bla&filename=/etc/passwd

Je pense que ca readfile() le /etc/passwd. Non ?

--
^ ___ ___ FreeBSD Network - http://www.GomoR.org/ <-+
| / __ |__/ Systems & Security Engineer |
| __/ | ---[ zsh$ alias psed='perl -pe ' ]--- |
+--> Net::Packet <=> http://search.cpan.org/~gomor/ <--+

Avatar
Cedric Blancher
Le Tue, 07 Jun 2005 08:16:04 +0000, gomor-usenet a écrit :
Si php.ini est configuré en register_globals = yes, en passant une
url du genre:
www.monsite.com/envoyer_mp3.php?id=bla&filename=/etc/passwd
Je pense que ca readfile() le /etc/passwd. Non ?


Si la variable filename n'a pas été initialisée, alors effectivement,
il y a une faille.

Ceci dit, le register_globals est à no par défaut dans les dernières
installations de PHP. Mais bon, certains bousins imposent son
positionnement à yes (comme me le faisait remarquer Simon récemment pour
PHP Nuke).

Moralité, c'est une putain de plaie ce register_globals...


--
Selon les logs, il y a des pertes de porteuses, mais surtout des
requêtes de déconnexion qui viennent de votre machine.
Il faut se rappeler que windows 95 est un systeme bio-dégradable.
-+- Support technique HOL in: Guide du Cabaliste Usenet - CQFD ! -+-

Avatar
Nicob
On Mon, 06 Jun 2005 15:40:47 +0000, Fabien LE LEZ wrote:

À noter qu'il est très difficile d'interdire le téléchargement d'un
fichier, i.e. forcer le streaming. Même un vrai serveur de streaming
(style Real Video) ne résiste pas à Net Transport.


Limitation du débit au minimum nécessaire pour le streaming ? Je ne sais
plus quelle radio fait ça, mais ça décourage pas mal le dwld de bourrin ...


Nicob

Avatar
Nicob
On Tue, 07 Jun 2005 08:23:08 +0000, Cedric Blancher wrote:

Mais bon, certains bousins imposent son positionnement à yes


Il y a même certaines applis PHP qui "émulent" le register_globals à
On en important tout ce qui est en GET/POST/Cookie dans le namespace
global. Juste histoire d'être sûr que le pauvre webmestre ait son appli
qui marche du premier coup ...

Désespérant ...

PHP Nuke


Mouahahahahaha !!! T'as pas pire comme exemple ? ;-)


Nicob

Avatar
Cedric Blancher
Le Tue, 07 Jun 2005 08:46:24 +0000, Nicob a écrit :
PHP Nuke
Mouahahahahaha !!! T'as pas pire comme exemple ? ;-)



PhpBB ? Phorum ?


--
RECHERCHE DES INGENIEURS DANS Linformatique IMPORTANT !!
Envoyez moi vos cV
-+- in Guide du Neuneu sur Usenet : Linformatique pour les nuls -+-


1 2 3