probleme de lecteur audio html5 sur version mobile

Eléphant du PHP | 58 Messages

28 sept. 2015, 16:03

Bonjour à tous,

Voici mon problème :
J'ai des sons sur un site qui sont protégés du téléchargement via un script PHP et de l'URLrewriting.
jusqu'ici cela marche bien avec un navigateur d'ordi, j'y ai mis un lecteur audio flash pour la lecture, car le lecteur <audio> ne marche pas avec ce systeme car il ne trouve pas l'url (la vraie) du fichier et donc il disparait...

et c'est la mon souci ! parce que sur la version mobile, du coup pas de lecteur flash, du coup pas de possibilité d'ecouter le son...

auriez-vous une idée de comment je pourrais contourner le probleme ??

merci d'avance,
et bonne journée a vous,

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

28 sept. 2015, 22:38

Bonjour,

Pour contourner le soucis, la seule solution est d'utiliser le player HTML5 <audio>
Après il faut que tu trouves une solution pour rendre l'url du fichier plus difficile à récupérer.
Soit un token unique, ou alors faire un encodage de ton fichier dans un format moins usuel par exemple en MPEG-DASH.

Ou sinon avec "Media Source Extension" (MSE) de HTML5, on peut traiter les données reçues via javascript donc ça devrait être possible de faire un encodage en amont de tes fichiers et de les décoder ensuite en javascript avant de les passer dans le player <audio>
Toutefois pour cette dernière solution, je n'ai pas essayé et j'ai eu beau chercher je n'ai pas trouvé d'exemples sur le net qui ont fait ça...
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

28 sept. 2015, 23:09

Merci tout d' abord de ta réponse :lol:
Ensuite j'utilise déjà un token unique et avec un urlRewriting je fais que le nouveau nom de fichier mène au vrai fichier... Sauf que physiquement, ce nouveau nom n'existe pas et du couple lecteur <audio> disparaît car apriori il ne comprend que l'url physique "vraie" du fichier....

Je vais me renseigner sur le MPEG dash, merci de l'info.

Ensuite pour le JavaScript, du coup je trouve ça moins sécurisé que la metode actuelle, car un affichage du code indiquera tout. Et puis même chose si a la finale je n'ai pas l'URL "vraie" le <audio> ne s'affichera pas...

Pas simple ! :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 sept. 2015, 00:01

La notion "d'url physique vraie" n'existe pas ; et la balise <audio> comme <video> fonctionne très bien avec de l'url-rewriting et des token.
Vérifie les logs dans la console de ton navigateur et les appels réseaux effectués (Ctrl+i pour accéder aux outils de développement) pour trouver d'où vient le problème.

La solution en javascript est relativement sécurisée car le fichier diffusé va être chiffréet il faudra ensuite que le hacker le décrypte pour récupérer le fichier mais ça veut dire rentrer dans le code javascript trouver les clés et la routine de décodage et la réappliquer en offline... bref, c'est beaucoup d'efforts pour pas grand chose et il aura + vite fait d'utiliser un soft d'enregistrement de ce qui passe par la carte son et que tu ne pourras jamais contrer.

:arrow: Quoiqu'il en soit il faut bien avoir en tête qu'il est impossible de sécuriser à 100% un fichier diffusé sur internet pour empécher qu'il soit récupérable. Au mieux, tu peux rendre cela plus fastidieux.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

29 sept. 2015, 08:53

salut @rthur !

sur mon site, je lis actuellement les sons (avec token et urlrewriting) et ca passe sans souci, mais des que je met la meme url du son dans <audio> le player disparait... c'est bizarre quand meme... mais je vais regarder dans la console effectivement voir s'il y a un souci mais la comme ca tout de suite, je vois pas ce qui pourrait se passer, pusique mon fichier php cible marche avec le player flash, et me retourne bien mon son... bref, j'avoue que c'est la première fois que je fais ca, donc, y'a plein de choses que je n'ai pas du prendre en compte... je vais voir ça cet apres midi, et je reviens pour dire ce qu'il en est.

apres pour la sécurité, oui effectivement je suis conscient (et j'ai prévenu mon client) que la sécurité au moins sur le son n'existe pas totalement... ma remarque sur le javascript était du coup peu intéressante ;)
je regarde tout ça, et je reviens pour te dire ce qu'il en est !

merci de ton aide et bonne journée a toi,

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 sept. 2015, 16:31

Une solution pour faciliter le debugage c'est de faire une page de test minimaliste uniquement avec ton player audio dedans qui essaye de lire le fichier.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

05 oct. 2015, 16:04

Salut @rthur !
Desolé du laps du temps passé depuis mon dernier message.
bref,
j'ai fait une page avec juste le lecteur.
tu verras j'ai mis a la fois sans le token, avec les 2 lecteurs (flash et html) et avec le token, pareil avec les 2 lecteurs, la meme adresse de fichier a chaque fois, et j'ai toujours ce souci du lecteur html qui disparait...
j'ai été dans la console, et je n'ai rien vu de bizarre qui m'explique ca...
peut-etre vois-tu quelque chose de ton coté que je n'arrive pas a voir ?
la page est : http://www.arlfm.com/test-son.

qu'en penses-tu ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

05 oct. 2015, 18:59

j'ai été dans la console, et je n'ai rien vu de bizarre qui m'explique ca...
Moi, ma console me dit ça :
Le « Content-Type » HTTP « text/html » n'est pas géré. Le chargement de la ressource média http://www.arlfm.com/agenda-32_b95f1662 ... 9f3be5.mp3 a échoué.

En gros ta redirection renvoie un content-type text/html au lieu de audio/mpeg pour un fichier MP3.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

05 oct. 2015, 21:07

ah oui, je ne l'avais pas vu car j'étais sous chrome, et du coup je ne sais pas trop me servir de la console ! (d'ailleurs sous chrome ça marche... le player html5 reste, sous Edge aussi, sous safari, aucun des lecteur html n'apparait, et sous opera, c'est un mix, il apparait mais ne marche pas !)
et du coup, je viens donc de voir l'erreur sur la console de Mozilla effectivement... bon je vais essayer de regler ca alors ;)

en tout cas merci beaucoup pour ton aide !
quand c'est réglé, je viens le dire haut et fort ici !

bonne soirée a toi,
et encore merci !!!

Eléphant du PHP | 58 Messages

06 oct. 2015, 13:29

bonjour @rthur,

bon j'ai bien changé mon Content-Type (avant il etait en "audio/mp3"... je te passe sur la bourde...).
bref, et cela ne change rien... j'ai la meme erreur...
j'ai essayé de mettre mon header("Content-Type : audio/mpeg"); en haut de ma page 'play.php' (page qui gere le token et me renvoi le fichier avec un readfile($fichier);
est-ce que j'ai loupé un truc ??

mon code de page :

Code : Tout sélectionner

<?Php if(!isset($_GET['token'])) { exit(); } $token = htmlspecialchars($_GET['token']); $sqlSonsInsert="INSERT INTO table_token SET token='".$token."', fichier='".htmlspecialchars($_GET['type']."s-".$_GET['id'])."'"; $reqSonsInsert=$mysqli->query($sqlSonsInsert) or die('Erreur SQL Sons Insert !<br />'.AffSQL($sqlSonsInsert).'<br />'.$mysqli->error); $reqSonsInsert->free_result; $sqlSons="SELECT fichier FROM table_token WHERE token='".$token."'"; $reqSons=$mysqli->query($sqlSons) or die('Erreur SQL Sons !<br />'.AffSQL($sqlSons).'<br />'.$mysqli->error); $reqSons->free_result; if (!$reqSons->num_rows) { //echo 'stop'; exit(); } else { $sonInfo=$reqSons->fetch_assoc(); $ExplodeInfos=explode('-', $sonInfo['fichier']); $Champ='fichier'; $sqlSon="SELECT ".$Champ.", ecoutes FROM new_sons_".$ExplodeInfos[0]." WHERE id='".$ExplodeInfos[1]."'"; $reqSon=$mysqli->query($sqlSon) or die('Erreur SQL Son !<br />'.AffSQL($sqlSon).'<br />'.$mysqli->error); $reqSon->free_result; if (!$reqSon->num_rows) { exit(); } else { $sonInfos=$reqSon->fetch_assoc(); // ajout +1 en écoute $sqlSon="update table_son set ecoutes='".($sonInfos['ecoutes']+1)."' WHERE id='".$ExplodeInfos[1]."'"; $reqSon=$mysqli->query($sqlSon) or die('Erreur SQL Son !<br />'.AffSQL($sqlSon).'<br />'.$mysqli->error); $reqSon->free_result; $fichier=$_SERVER["DOCUMENT_ROOT"].$racineSite.'sons/'.$sonInfos[$Champ]; if(file_exists($fichier) && is_readable($fichier)) { $sqlDelSons="DELETE FROM new_sons_secure_token WHERE token='".$token."'"; $reqDelSons=$mysqli->query($sqlDelSons) or die('Erreur SQL Del Sons !<br />'.AffSQL($sqlDelSons).'<br />'.$mysqli->error); $reqDelSons->free_result; header('Content-Type: audio/mpeg'); readfile($fichier); exit(); } } } ?>
je reprécise, que j'ai essayé aussi de mettre header('Content-Type: audio/mpeg'); tout en haut de page...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 oct. 2015, 20:42

Le content type est toujours text/html, regarde la console de ton navigateur et l'onglet réseau > entête
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

06 oct. 2015, 23:23

oui justement c'est ca que je ne comprends pas... je lui indique bien pourtant que c'est un autre Content-Type !?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 oct. 2015, 00:26

Bah pars d'un script minimaliste qui fait juste l'envoi du header et le readfile et vérifie que ça fonctionne.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 58 Messages

07 oct. 2015, 16:02

hello !

j'ai fait ca :

Code : Tout sélectionner

header('Content-Type: audio/mpeg'); $fichier=$_SERVER["DOCUMENT_ROOT"].'/sons/agendas/agenda-bons-plans_radioARL_20151003_111651.mp3'; readfile($fichier);
je ne peux pas faire plus simple, et ... ca ne marche toujours pas, la console me donne toujours la meme erreur...
la je ne sais pas du tout comment faire !?

ce qui est bizarre, dans la console, c'est qu'il y a des lignes ou il appel le fichier token et qu'il est bien chargé... A quoi faire référence ce Content-Type ?? au readfile() ou a ma page play.php ???

message de la console :

Code : Tout sélectionner

GET http://www.arlfm.com/test-son [HTTP/1.1 200 OK 296ms] GET http://www.arlfm.com/sons/player_mp3.swf [HTTP/1.1 304 Not Modified 58ms] [b]GET http://www.arlfm.com/agenda-32_a314b3da0f8025ebf6c5ee79a1c5e30e.mp3 [HTTP/1.1 200 OK][/b] GET http://www.arlfm.com/sons/player_mp3.swf [HTTP/1.1 304 Not Modified 61ms] Le « Content-Type » HTTP « text/html » n'est pas géré. Le chargement de la ressource média http://www.arlfm.com/agenda-32_a314b3da0f8025ebf6c5ee79a1c5e30e.mp3 a échoué. test-son Le chargement de toutes les ressources possibles a échoué. Le chargement du média a été arrêté. test-son GET http://www.arlfm.com/sons/agendas/agenda-bons-plans_radioARL_20151003_111651.mp3 [HTTP/1.1 206 Partial Content 7530ms] GET [b]http://www.arlfm.com/agenda-32_ac5e1fc6496b328721a7997bae80e57f.mp3 [HTTP/1.1 200 OK [/b]14159ms]

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 oct. 2015, 20:16

Voici le code que j'ai essayé (et qui marche) :
<html>
<body>
<audio preload="false" controls><source src="audio.php" /></audio>
</body>
</html>
Et le fichier audio.php :
<?php
header('Content-Type: audio/mpeg');
$fichier='agenda-bons-plans_radioARL_20151003_111651.mp3';
readfile($fichier);
Quand tout le reste a échoué, lisez le mode d'emploi...