Remplacer la fonction Include

Radio Klub
Invité n'ayant pas de compte PHPfrance

22 juil. 2007, 15:51

Bonjour,

Je viens de changer d'hébergeur et un script qui fonctionnait précédemment chez mon ancien hébergeur, ne fonctionne pus chez le nouveau, motif : blocage des INCLUDE pour des raisons de sécurité.

D'où ma question :

Comment remplacer les lignes de commandes suivantes :

include ("config1.php");
include ("scastxml.php");

Systèmatiquement, le fichier concerné plante mon site


Cordialement,


Marc


les 3 fichiers correspondant sont les suivants :

CONFIG.1.PHP

<?php
ini_set('max_execution_time','10');
////////////////////////
// Configuration file //
////////////////////////
// Shoutcast server ip, port number and password
$host = "tv3.stream-music.net";
$port = "8402";
$password = "*****";
// End shoutcast server config
// Default configuration if server is down
$title = "Radio Klub";  // Title of radio station, use same as shoutcast dsp plug-in
$cstmsg = "Radio Klub est actuellement en maintenance, merci pour votre patience !"; // Custom message you want to tell your listeners if server is offline
// End
// Config for look and feel

// End
// Misc Config
$reset = "2";               // How often in days are stats (SERVER) reset, default is 3
$detailed = "1";            // Detailed stats on or off (1=on) (0=off)
$djname = "Dj Marko";       // Your dj name dhu!!
$refresh = "10";            // How often in seconds should the pages refresh themselves
?>



SCASTXML.PHP

<?
include ("config1.php");
$listenlink = 'http://'.$host.':'.$port.'/listen.pls';  //make link to stream
$fp = @fsockopen("$host", $port, &$errno, &$errstr, 30); //open connection
if(!$fp) {
	$success=2;  //set if no connection
}
if($success!=2){ //if connection
 fputs($fp,"GET /7.html HTTP/1.0\r\nUser-Agent: SHOUTcast stats XML Parser (Mozilla Compatible)\r\n\r\n"); //get 7.html
 while(!feof($fp)) {
  $page .= fgets($fp, 1000);
 }
 @fclose($fp); //close connection
 $page = ereg_replace(".*<body>", "", $page); //extract data
 $page = ereg_replace("</body>.*", ",", $page); //extract data
 $numbers = explode(",",$page); //extract data
 $currentlisteners=$numbers[0]; //set variable
 $connected=$numbers[1]; //set variable

 if($connected==1) //if DSP is connected
  $wordconnected="yes"; //set variable
 else //if no DSP connection
  $wordconnected="no"; //set variable
 $peaklisteners=$numbers[2]; //set variable
 $maxlisteners=$numbers[3]; //set variable
 $reportedlisteners=$numbers[4]; //set variable

}

if($connected==1){  //only do if DSP is connected
 $fp = @fsockopen("$host", $port, &$errno, &$errstr, 30);  //open connection
  if(!$fp) { //if no connection
   $success1=2; //dummy variable to see if successful connect
  }
 if($success1!=2){ //only do if connected
  fputs($fp,"GET /index.html HTTP/1.0\r\nUser-Agent: SHOUTcast stats XML Parser (Mozilla Compatible)\r\n\r\n"); //get index.html
  while(!feof($fp)) {
   $page .= fgets($fp, 1000);
  }
  $pageed = ereg_replace(".*Stream is up at ", "", $page); //extract data
  $bitrate = ereg_replace(" kbps.*", "", $pageed); //extract data
  @fclose($fp); //close connection

 ##Print out bitrate.##
 //echo('$bitrate = '.$bitrate.' <BR>');
 ##You know the drill stop here.##

 }
}

$fp = @fsockopen("$host", $port, &$errno, &$errstr, 30); //open connection yet again
 if(!$fp) {  //if connection
  $success2=2;
 }
if($success2!=2){ //if connected

 //for newer shoutcast servers
fputs ($fp, "GET /admin.cgi?mode=viewxml HTTP/1.1\r\nHost: $host:$port\r\n .
User-Agent: SHOUTcast Listener Stats (author: [email protected])(Mozilla Compatible)\r\n .
Authorization: Basic ".base64_encode ("admin:$password")."\r\n\r\n");

while(!feof($fp)) {
  $page .= fgets($fp, 1000);
 }

 $loop = array("AVERAGETIME", "SERVERGENRE", "SERVERURL", "SERVERTITLE", "SONGTITLE", "SONGURL", "IRC", "ICQ", "AIM", "WEBHITS", "STREAMHITS", "INDEX", "LISTEN", "PALM7", 
               "LOGIN", "LOGINFAIL", "PLAYED", "COOKIE", "ADMIN", "UPDINFO", "KICKSRC", "KICKDST", "UNBANDST", "BANDST", "VIEWBAN", "UNRIPDST", "VIEWRIP", "VIEWXML", 
              "VIEWLOG", "INVALID"); //define all the variables to get (delte any ones you don't want)
 $y=0; //dummy variable for while loop
 while($loop[$y]!=''){ //while there are things in loop
  $pageed = ereg_replace(".*<$loop[$y]>", "", $page); // extract data
  $phpname = strtolower($loop[$y]); //make names in loop lowercase for variable names
  $$phpname = ereg_replace("</$loop[$y]>.*", "", $pageed); //finish extracting data
  if($loop[$y]==SERVERGENRE || $loop[$y]==SERVERTITLE || $loop[$y]==SONGTITLE) //if for code clean-up (if you have problems with variables with URL encoding (i.e. %20 for space put them in this loop)
   $$phpname = urldecode($$phpname); // replace URL code with regular text (i.e. %20 = space)


  $y++; //update dummy variable for while loop
 }
 $pageed = ereg_replace(".*<SONGHISTORY>", "", $page); //extract data
 $pageed = ereg_replace("<SONGHISTORY>.*", "", $pageed); //extract data
 $songatime = explode("<SONG>", $pageed); //break data down for each song
 $r=1; //dummy variable
 while($songatime[$r]!=""){ //while loop for each song
  $t=$r-1; //correction for first value in array from explode is worthless
  $playedat[$t] = ereg_replace(".*<PLAYEDAT>", "", $songatime[$r]); // extract data
  $playedat[$t] = ereg_replace("</PLAYEDAT>.*", "", $playedat[$t]); //extract data
  $song[$t] = ereg_replace(".*<TITLE>", "", $songatime[$r]); //extract data
  $song[$t] = ereg_replace("</TITLE>.*", "", $song[$t]); //extract data
  $song[$t] = urldecode($song[$t]); //cleans-up the URL code thing again

$frmt_date[$t] = ($playedat[$t]);

  $r++; //update loop variable
 }
 $pageed = ereg_replace(".*<LISTENERS>", "", $page); //extract data
 $pageed = ereg_replace("</LISTENERS>.*", "", $pageed); //extract data
 $listeninfo = explode("<LISTENER>", $pageed); //break apart data
 $r=1; //dummy loop variable
 while($listeninfo[$r]!=""){ //while loop for extraction
  $t=$r-1; //correction for first value in array from explode is worthless
  $hostname[$t] = ereg_replace(".*<HOSTNAME>", "", $listeninfo[$r]); //extract data
  $hostname[$t] = ereg_replace("</HOSTNAME>.*", "", $hostname[$t]); //extract data
  $useragent[$t] = ereg_replace(".*<USERAGENT>", "", $listeninfo[$r]); //extract data
  $useragent[$t] = ereg_replace("</USERAGENT>.*", "", $useragent[$t]);  //extract data
  $underruns[$t] = ereg_replace(".*<UNDERRUNS>", "", $listeninfo[$r]);  //extract data
  $underruns[$t] = ereg_replace("</UNDERRUNS>.*", "", $underruns[$t]);  //extract data
  $connecttime[$t] = ereg_replace(".*<CONNECTTIME>", "", $listeninfo[$r]);  //extract data
  $connecttime[$t] = ereg_replace("</CONNECTTIME>.*", "", $connecttime[$t]);  //extract data


  $r++;  //update loop variable
 }
 fclose($fp);  //close connection 
}

?>



Et le 3e fichier sur le quel je pointe




<body bgcolor="#000000">

 <?php
include ("config1.php");
include ("scastxml.php");
echo"
<html>
  <tr>
<div align=center><b>Actuellement sur Radio Klub</b></div>
   <marquee>$song[0]</marquee>
    <p>&nbsp;</p>
    <p>Auditeurs en ligne : $currentlisteners/$maxlisteners<br></p>
    <p>Qualité : $bitrate kbps<br>
    &nbsp;</p>
    <p>Nombre d'auditeurs : $streamhits<br>
    Nombre total de Hits : $webhits<br>
    Moyenne d'écoute : $averagetime s<br></td></p>

  </tr> </font>";
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juil. 2007, 16:16

Question bête, mais.... tu es sur de la raison invoqué ? je ne vois pas trop quel hébergeur irait bloquer la fonction include alors qu'elle est utilisée par la majorité des sites fait en php et est indispensable à tout ceux basés sur les pseudos frames... As-tu un messages d'erreur qui le dit clairement ou une info de ton hébergeur ? (par curiosité tu es chez qui d'ailleurs ?)

As-tu essayé les fonction include_once() require() ou require_once() à la place ?

Ca serait pas pluôt l'utilisation de short open tags (<? au lieu de <?php) dans certains de tes scripts qui serait la cause du problème ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 juil. 2007, 17:53

Attention à ne pas laisser trainer tes identifiants de connexion (mot de passe) dans les messages que tu postes :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 juil. 2007, 18:06

je ne vois pas trop quel hébergeur irait bloquer la fonction include
...d'autant plus que ce n'est pas une fonction et donc je doute qu'on puisse la désactiver :lol:

Au pif, je dirais que ce sont les fonctions de sockets qui ont été désactivées.

Au passage, je note que Radio Klub a ignoré l'avertissement affiché lors de la rédaction de nouveaux sujets concernant la longueur des scripts ou l'inclusion de HTML inutile.

ViPHP
ViPHP | 5924 Messages

22 juil. 2007, 18:11

Non, mais peut être que l'hébergement est en safe-mode, ca restreint les includes je crois, non ?

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 14:31

Effectivement, mon hébergeur est en safe-mode et m'a expliqué que les fonctions INCLUDE ne fonctionnent pas.


Il y a t-il une autre solution ?


Cordialement,


Marc

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 14:34

Je suis chez ONE.com

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juil. 2007, 14:54

Ben c'est plutôt à eux de te dire quelles alternatives ils te proposent. Peut être ont ils défini les include_dir dans lesquels tu peux quand même mettre tes fichiers pour les inclures ?

Sinon, tu dois pouvoir définir ta propre fonction include() qui lira le fichier à inclure passé en paramètre et fera un très sécurisé eval() :) Ca reste un peu ridicule de bloquer les includes ceci dit. Je crois que la version 6 a d'ailleurs supprimé le safe mode non ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 16:39

Voilà leur réponse en anglais :

We did have a update on PHP, where we have disabled allow_url_include

The new default is set to off i.e. remote files cannot be included. This is for security since this is the main source of hacked pages/websites abused to send spam. It is still possible to open remote files, just not to include and execute remote code.

ViPHP
ViPHP | 928 Messages

23 juil. 2007, 16:41

include() marche très bien sur ton serveur (fonction non désactivable). Ils ont juste désactiver la directive permettant d'inclure via le protocole HTTP.

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 16:51

Il me reste a faire quoi alors ?

Je suis assez light en PHP

Merci

ViPHP
ViPHP | 928 Messages

23 juil. 2007, 16:57

La seule chose qui plante ton site est le contenu de SCASTXML.PHP je supose.

Créé un fichier test.php et met ce code :

Code : Tout sélectionner

<?php error_reporting(E_ALL); $errno = 0; $errstr = ''; $fd = fsockopen("www.google.com", 80, $errno, $errstr); if (!$fd) { echo "Erreur [$errno] [$errstr]"; } else { echo 'OK !'; } ?>
ensuite lance le, il t'affiche quoi ?

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 17:15

Si j'active le module .php concerné, car mon site est un CRM Joomla, en y insérant le test.php à la racine du site, ca plante qd meme le site.

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 17:21

Si j'active le module en php qui plante mon site => voir script plus haut du 3e fichier


et que je pointe mon site sur le test.php, il m'affiche une page avec le OK!

Radio Klub
Invité n'ayant pas de compte PHPfrance

23 juil. 2007, 23:31

C'est effectivement le SCASTXML.PHP qui plante le site


Si je suprime le fichier, le site se lance

Quel solution alors ?