8792 sujets

Développement web côté serveur, CMS

Bonjour à tous et à toutes,
J'avais réussis à trouver un petit script super sympa qui me permettait de faire tourner un moteur de recherche sur un site en HTML. Or voilà, je viens d'apprendre que ce dernier n'est pas sécuritaire :-° .

Voici son message :
"Je peux vous confirmer que nos serveurs supporte votre application mais uniquement si vous respectez les consignes de sécurité de PHP.
Nous utilisons PHP 5 qui permet l’utilisation de variables globales en « ouvrant » cette possibilité.
Les serveurs supérieurs au nôtre utilisent PHP 6 et dans cette version il est « impossible » d’utiliser les variables globales tel qu’elle sont dans votre code.
Notre serveur réponds aux besoins des clients mais nous nous assurons aussi d’éviter les failles de sécurité afin de répondre aussi aux besoins futurs. Si vous désirez « vraiment » ouvrir cette brèche, des tâches différentes devront être envisagées."

Je dois dire que je m'y connais un peu en PHP mais la question sécurité... c'est trop nouveau pour moi. Alors j'ai demandé à mon FAI régulier ce qu'il en pensait de cet avertissement. Il m'a dit que le tout était très relatif puisque OS commerce fonctionnait avec de genre d'architecture.

En définitive, il m'a dit que la source du problème pourrait provenir du code en soi. J'ai demandé à l'auteur mais pas de réponse depuis 4 jours... Voici le code qui provient du site http://homeproduction.free.fr/mysearchengine/index.htm


voici la page mysearch.php
<?php
function resum($inputText,$mot)
{
  $inputText=ereg_replace("\n","",$inputText);
  $sauvegarde=$inputText;
  $inputText=strtolower($inputText);
  $position=strpos($inputText,$mot);
  $sposition=$position;
	  while (substr($inputText,$position,1)!="."&&$position!=0)
	{
	  $position--;
	}
if ($position==0)
	{$position=$sposition;
	}
  $token="....".ereg_replace(",","",substr($sauvegarde,$position,250))."...";
  return($token);
}
include("conf-recherche.php");
if ($elapseTime=false) $elapseTime=0;
$search=trim(strtolower(stripslashes($search)));
while(substr($search,0,1)=="+"||substr($search,0,1)=="*"||substr($search,0,1)=="-")
{
 $search=substr($search,1,strlen($search));
}
while(substr($search,strlen($search)-1,1)=="+"||substr($search,strlen($search)-1,1)=="*"||substr($search,strlen($search)-1,1)=="-")
{
 $search=substr($search,0,strlen($search)-1);
}
$nombremot=0;
for($compteur=0;$compteur<=strlen($search);$compteur++)
{
  $caractere=substr($search,$compteur,1);
  if($ouvreguillemet==1)
  {
    if ( $caractere=="\"")
    {
      $guillemet=1;
      $ouvreguillemet=0;
    }
    continue;
  }
  else
  if ($caractere=="\"")
  {
    $debutmot=$compteur;
    $ouvreguillemet=1;
  }
  if($caractere==" ")
	{
	if(substr($search,$compteur+1,1)==" "||substr($search,$compteur+1,1)=="+"||substr($search,$compteur+1,1)=="-"||substr($search,$compteur+1,1)=="*")
		{
		$search=substr($search,0,$compteur).substr($search,$compteur+1,strlen($search));
		$compteur--;
		continue;
		}
	 if(substr($search,$compteur-1,1)==" "||substr($search,$compteur-1,1)=="+"||substr($search,$compteur-1,1)=="-"||substr($search,$compteur-1,1)=="*")
		{
		$search=substr($search,0,$compteur).substr($search,$compteur+1,strlen($search));
		$compteur--;
		continue;
		}
  else
    {$caractere=$defaut;}
  }
  if($caractere=="+"||$caractere=="-"||$caractere=="*")
  {
    if($nombremot==0)
    {
      if($guillemet==1)
      {
        $motclef[0]=substr($search,1,$compteur-2);
        $guillemet=0;
      }
      else $motclef[0]=substr($search,0,$compteur);
      $operateur[0]=$caractere;
    }
    else
    {
      if($guillemet==1)
      {
        $motclef[$nombremot]=substr($search,$debutmot+1,$compteur-$debutmot-2);
        $guillemet=0;
      }
      else $motclef[$nombremot]=substr($search,$debutmot+1,$compteur-$debutmot-1);
      $operateur[$nombremot]=$caractere;
    }
    $debutmot=$compteur;
    $nombremot++;
  }

}
if($guillemet==1)$motclef[$nombremot]=substr($search,$debutmot+1,strlen($search)-$debutmot-2);
elseif($nombremot==0)$motclef[0]=$search;
else $motclef[$nombremot]=substr($search,$debutmot+1,strlen($search));
for($x=0;$x<$nombremot;$x++)
{
  if($operateur[$x]=="+")$operateur[$x]="&&";
  if($operateur[$x]=="-")$operateur[$x]="||";
  if($operateur[$x]=="*")$operateur[$x]="&&!";
}
if($search==""||isset($search)==0)
{
  include("index.html");
}
else
{
  $CurrentTime=time();
  $irep=0;
  $nb=0;
  for($x=0;$x<=$nombremot;$x++)
  {
    $motclef[$x]=htmlentities($motclef[$x]);
  }
  
  while ($repertoire[$irep])
 {
  $url=$repertoire[$irep];
  $rep=opendir("$url");
  
  while($dir = readdir($rep))
  {
    if ($dir == "." || $dir == "..") continue;
    if($dir == "index.php" || $dir == "conf-recherche.php" || $dir == "lib-recherche.php") continue;
	$iext=0;
	$true=0;
	while ($ext[$iext])
	  {
		if(strpos($dir, ".".$ext[$iext]."")) 
			{
			$true=1;
			}
		$iext++;
	  }
	if ($true==0) continue;
    if(!($fichier = file($url.$dir)))
    {
      echo "<font face='Verdana' size='2'>Impossible d'ouvrir le fichier $dir</font>";
      continue;
    }
    $fichier = implode($fichier, ",");
    $debut_titre = strpos($fichier, "<title>") + 7;
    $fin_titre = strpos($fichier, "</title>");
    $longueur = $fin_titre - $debut_titre;
    if ($fin_titre != "" && $longueur != 0)
    {
      $titre = substr($fichier, $debut_titre, $longueur);
    }
    else
    {
      $titre = $dir;
    }
	$fichier=strip_tags($fichier);
    for($indexmotclef=0;$indexmotclef<=$nombremot;$indexmotclef++)
    {
      $text=strtolower($fichier);
      $occurance[$indexmotclef]=-1;
	  if ($motclef[$indexmotclef]!="")
		  {
      do
      {
        $text1=strstr($text,$motclef[$indexmotclef]);
        $occurance[$indexmotclef]++;
        $text=substr($text1,strlen($motclef[$indexmotclef]));
      }
      while ($text1!="");
    }
	}
    $resultat=0;
    if ($nombremot>=1)
    {
      $test="";
      for ($x=0;$x<=$nombremot;$x++)
      {
        $test="$test$occurance[$x]$operateur[$x]";
      }
      $resultat="\$resultat=$test;";
      eval($resultat);
    }
    else
    {
      if($occurance[0]>0)$resultat=1;
    }
    if($resultat==1)
    {
      $nb++;;
      $total=0;
      for ($x=0;$x<=$nombremot;$x++)
      {
        $total=$total+$occurance[$x];
      }
	  $urldir=$url.$dir;
      $score[$urldir]=$total;
      $letitre[$urldir]=$titre;
      $extrait[$urldir]=resum($fichier,$motclef[0]);
    }
    for ($x=0;$x<=$nombremot;$x++)
    {
      $occurance[$x]=0;
    }
  }
closedir($rep);
$irep++;
}
}
if ($nb>0)
{
arsort($score);
$titre=fopen("titre.txt","w");
$adresse=fopen("adresse.txt","w");
$resume=fopen("resume.txt","w");
for($x=reset($score);$x;$x=next($score))                      
{
 fputs($titre,$letitre[key($score)]);
 fputs($titre,"\n");
 fputs($adresse,key($score));
 fputs($adresse,"\n");
 fputs($resume,$extrait[key($score)]);
 fputs($resume,"\n");
}
 fclose($titre);
 fclose($adresse);
 fclose($resume);
}
$debut=0;
$elapseTime=time()-$CurrentTime;
include("affichage.php");
?>


Ensuite la page de configuration


<?
/* $url[] est un tableau qui contient les chemins des repertoires dans lesquels vous  **
** souhaitez que la recherche s'effectue (attention[!], vous **
** ne pouvez pas mettre une adresse de type  http://  ou toute **
** autre adresse internet, mettez par rapport au répertoire  **
** courant). Vous devez modifier ces paramêtres pour qu'ils correzspondent à la structure de votre site web */
$repertoire[0]= "../";
//$repertoire[1]="../mysearch/";
/* Indiquez ici le type de fichier dans lequel vous voulez **
** rechercher. (ex : 'htm')                                */
$ext[0]="htm";
$ext[1]="php";
$ext[2]="html";
/* defaut correspond au critere que représentera un espace entre deux mots clefs
il peut être égal à +pour "et", - pour "ou" et * pour "sauf". Ici il est  égal à et*/
$defaut="+";
/* nombreresultats indique le nombre de résultat affichés par page*/
$nombreresultats=10;
?>


Et la page qui sert à afficher le tout en milieu test


<HTML>
<HEAD>
<title>Résultats de le recherche</title>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<META http-equiv="Content-language" content="fr">
<META name="Author" content="Serge Nicolas">
<META name="Copyright" content="Pharmacie du sablon">
<META name="Rating" content="general">
<META name="Revisit-after" content="7 days">
<META name="Robots" content="index, follow">
</HEAD>
<link rel="stylesheet" href="styles.css">
<BODY bgcolor="#CCFFCC">
<?
include("conf-recherche.php");
/*on recupere les données*/
if (!$elapseTime) $elapseTime=0;
$titre=file("titre.txt");
$adresse=file("adresse.txt");
$resume=file("resume.txt");
print"
<br>
<br>
<table width=100% bgcolor='339966'>
<tr >
<td align='left' class='lien'>

Recherche :$search

<td class='lien'>";
$affiche=$debut+1;
print"
Résultat";
if($nb>=2)print "s : $debut - "; else print": $debut - ";
if ($nb<$debut+$nombreresultats) print "$nb";
else { 
	$affiche=$debut+$nombreresultats;
	print "$affiche";}
print"
</td>
<td class='lien'>
La recherche a pris $elapseTime seconde";
if ($elapseTime>=2) print"s."; else print".";
print"
</td>
</td>
<td align='right' class='lien'>

$nb";
if($nb>=2) print" Résultats trouvés"; else print" Résulat trouvé";
print"
</td>
</tr>
</table>
<br>
";
if($nb == 0)
        {
        print "<p class='corps'>Votre recherche -".$search."- ne correspond à aucun résultat.<br><br><ul><li class='corps'>Assurez vous d'orthographier correctement tous les mots.<li class='corps'>Essayez d'utliser moins de mots.<li class='corps'>Essayez d'utiliser des mots plus généraux.</ul><br></p>";
        }
else
        {
                $affichei=$debut+1;
                for ($i=$debut;$i<$debut+$nombreresultats;$i++)
                        {
                         if($titre[$i])
                                {
                                print("<span class='corps'><b>$affichei></b><a href='$url$adresse[$i]'>$titre[$i]</a></span> <br><font size='-2'>$adresse[$i]</font><br>");
                                print ("<span class='corps'<i>$resume[$i]</i></span><br><br>");
                                }
                                $affichei++;
                        }
                print"
						<center>
                        <table>
                        <tr>
						<td  align='right'>";
						 if($debut>0)
			{
							 $precedent=$debut-$nombreresultats;
							 print"
								 <a href='affichage.php?nb=$nb&debut=$precedent' class='lien'><img src='images/precedent.gif' border='0'></a>
								 ";
			}
					print"
					</td>
					<td  align='center'>
					<img src='images/search2.gif'>
					</td>
					<td align='left'>
						";
					if($debut+$nombreresultats<$nb)
			{
							$suivant=$debut+$nombreresultats;
							print"
								<a href='affichage.php?nb=$nb&debut=$suivant' ><img src='images/suivant.gif' border='0'></a>
								";
			}
					
					print"
					</td>
					</tr>
					<tr>
					<td align='center'>
						";
                if($debut>0)
                        {
                        print"
                        <a href='affichage.php?nb=$nb&debut=$precedent' class='soustitre'>Précédents</a>
                                ";
                        }
				print "</td>
				<td  align='center'>";
				$page=1;
				for($i=0;$i<$nb;$i=$i+$nombreresultats)

			{
					print "
						
						<a href='affichage.php?search=$search&debut=$i&nb=$nb' >$page</a>
						
						";
					$page++;
			}
			print"</td><td  align='center'>";
				if($debut+$nombreresultats<$nb)
			{
							$suivant=$debut+$nombreresultats;
							print"
								<a href='affichage.php?nb=$nb&debut=$suivant' class='soustitre'>Suivant</a>
								";
			}
						print"
						</td>
                        </tr>
                        </table>
						</center>
                        ";
                }
print"
<br><br>
<center>
<span class='corps' fontsize='-1'><a href='../mysearch/accueil.htm'>A propos de la recherche </a> - <a href='astuces.php'> Astuces pour la recherche</a>
</center>
<br><br>
";
?>


J'aimerais savoir ce que vous pensez de ce code au niveau de la performance et de la sécurité.



Merci beaucoup pour votre aide,
Yan.
Modifié par Felipe (05 Aug 2008 - 17:18)
Hello,

Je me permet de réponse uniquement sur la réponse que tu a cité, le code indiqué est un peu long pour que je puisse le lire et le commenter.

Ce dont il est question c'est la valeur de register_global, qui était avant à On par défaut et qui est maintenant à Off. Cela permettait de pouvoir utiliser la variable $foo en allant simplement sur la page page.php?foo=bar (sans passer par $_GET['foo'])

C'était très pratique, mais ouvrait de grandes failles de sécurité dans des scripts mal écrit.

Cela dit, encore aujourd'hui, beaucoup d'hébergeurs repassent par défaut la valeur de register_global à On sur les espaces qu'ils proposent. Certains font même pire et ne permettent pas de la remodifier en Off manuellement (je pense au Relais Internet par exemple).

Si tu peux, essaie de survivre avec le Off, et encore mieux, fait tes srcipts de façon à ce qu'ils fonctionnent en Off.
Si vraiment tu ne peux pas faire autrement, tu peux toujours modifier ce comportement en ajoutant dans un fichier .htaccess : "php_flag register_globals on".


P.S : Ah et OsCommerce EST mal écrit, et ne fonctionne que si les register_global sont à On.
Merci Tymlis,
J'ai fais une petite recherche sur la fonction registrar_global et il semble que le problème avec cette dernière c'est que la provenance de variables est inconnue. Cela explique en partie la difficulté que j'avais à comprendre ce script.

Y aurait-il un script alternatif à conseiller et gratuit ? Je sais, il y en a quelques uns sur le net mais, je voudrais une solution solide.

Peut-être même que ce script serait réutilisable ?

Merci pour vos commentaires.

Yan.
Salut akinayotaka, Smiley smile

akinayotaka a écrit :
J'ai fais une petite recherche sur la fonction registrar_global et il semble que le problème avec cette dernière c'est que la provenance de variables est inconnue.
Plus précisément il s'agit d'une directive PHP (c'est en quelque sorte un paramètre qui peut être activé -ON- ou non -OFF-) et ce n'est pas tant que la provenance des variables soit inconnue mais qu'il n'est pas obligatoire de la déclarer. Pour plus d'infos, voir la doc sur php.net.

Pour ce qui est d'adapter ce script, tu devrais en trouver de bien plus récents sur le web ! Smiley cligne

Sinon, d'une manière générale, c'est très très (etc...) très optimiste de mettre plusieurs pages de code d'un script de ce genre et de demander ce que les gens en pensent "au niveau de la performance et de la sécurité" car, en plus d'avoir de très sérieuses connaissances de ces questions, il s'agit ni plus ni moins de passer un temps fou dessus à le tester, décortiquer le code, etc... en clair, il faut vraiment tomber sur un pro qui s'ennuie terriblement pendant ses vacances ! Smiley lol

A+
Merci Heyoan pour ta franchise,
Le hic, c'est que sur le net on trouve de tout... Voilà pourquoi si l'un d'entre-vous aurait une moteur de recherche à me conseiller cela m'éviterait bien des embûches...

Quelqu'un serait-il prêt à me faire une proposition chiffrée pour mettre ce code à jour ? J'ai une proposition à 75 euros, quelqu'un serait-il capable de me faire cela pour ce prix ?

Yan.
Modifié par akinayotaka (06 Aug 2008 - 21:05)