8721 sujets

Développement web côté serveur, CMS

Bonjour j'ai un petit problème l'erreur me dit que cette variable n'est pas défini alors quelle l'est : $HTTP_SERVER_VARS (Pour un site multilangue) Merci infiniment pour votre aide.

[code]
<?php

if(isset($HTTP_COOKIE_VARS['lang'])) {
$lang = $HTTP_COOKIE_VARS['lang'];
} else {
// si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur
$lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);
}

//script d'origine
if ($lang=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
include('lang/fr-lang.php');
} elseif ($lang=='en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
include('lang/en-lang.php');
}
//fin du script d'origine

//définition de la durée du cookie (1 an)
$expire = 365*24*3600;

//enregistrement du cookie au nom de lang
setcookie("lang", $lang, time() + $expire);

?>
[code]
Bonjour
Voici un bout de code dont je me sers depuis longtemps.


$userLang  =  $_COOKIE['lang']; /* lire le cookie de la fois précédente */
  if($userLang  ==  '')  {
    $langItems  =  explode(',',  $_SERVER['HTTP_ACCEPT_LANGUAGE']); /* langues préférées dans le navigateur client */
    $langValues  =  array('en'  =>  0,  'fr'  =>  0); /* prévoir au moins les langues de repli 'en' et 'fr' */
    foreach($langItems  as  $langItem)  {
      $langElements  =  explode(';',  $langItem  .  ';q=1');
      $lang  =  substr($langElements[0],  0,  2); /* seulement les 2 premiers caractères */
      $val  =  $langElements[1]; /* représente le niveau de préférence  sous forme q=n*/
      $valElements  =  explode('=',  $val);
      $value  =  (float)$valElements[1]; /* valeur de préférence */
      if(isset($langValues[$lang]))  $prevVal  =  $langValues[$lang];
      else  $prevVal  =  0;
      if($value  >  $prevVal)  $langValues[$lang]  =  $value;
    }
    if($langValues['fr']  >  $langValues['en'])  $userLang  =  'fr';
    else  $userLang  =  'en';
  }
  setcookie('lang',  $userLang,  (time()  +  3600  *  24  *  365),  '/');

J'écrirais cela différemment aujourd'hui, mais ça fonctionne
PS je ne garantis pas le code copié ci-dessus, j'y ai ajouté des commentaires, il est possible que cela ait introduit des erreurs.
D'où sort cette variable $HTTP_SERVER_VARS ?
On dirait une antique version de PHP.
Je ne vois pas trop l'intérêt des cookies non plus à part pour une "opération portes ouvertes" aux injections de code
Voici un bout de code pour connaitre le language préféré de vos visiteurs :
<?php
header('Content-Type: text/plain');
$temp = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo '\$temp = ';
print_r($temp);
$langs = array();
foreach($temp as $entry) {
    if(preg_match('@^(\w{2}(?:-\w{2})?)(?:;q=((?:0|1)\.\d+))?$@', $entry, $matches)) {
        $langs[$matches[1]] = (!empty($matches[2])) ? floatval($matches[2]) : 1.0;
    }
}
// Langues par défaut
foreach(array('en'=>0.1, 'fr'=>0.05, 'cn'=>0.06) as $k=>$v) {
    if(!array_key_exists($k, $langs)) { $langs[$k] = $v; }
}
arsort($langs);
print_r($langs);
?>
Bonjour

Comme je l'ai dit plus haut, il s'agit d'un code qui date de plus de 5 ans, il est clair que je ne l'écrirais plus comme cela aujourd'hui.

Le cookie:
dans le contexte du site où j'utilise ce code, l'utilisateur a la possibilité de changer de langue en cliquant sur un bouton qui lui donne la langue désirée.
Dans ce cas, la langue d'affichage n'est plus forcément la langue préférée de l'utilisateur.
Le script qui réagit au bouton met le cookie à la nouvelle langue, et les affichages suivants sont faits dans la nouvelle langue, même si ce n'est pas la langue préférée: on prend alors celle du cookie.

Je serais intéressé par une explication de cette phrase:
Je ne vois pas trop l'intérêt des cookies non plus à part pour une "opération portes ouvertes" aux injections de code
Si l'utilisation des cookies est une porte ouverte aux injections de code, cela veut dire que 90% des sites professionnels le sont, ce qui m'étonnerait fort.
Avec "$userLang = $_COOKIE['lang'];" vous faites une confiance aveugle aux visiteurs de votre site.
Rien n'empêche aux visiteurs d'envoyer du code PHP en guise de cookie. On peut faire cela avec des outils comme curl disponible dans toutes les distributions Linux.
Quand le visiteur choisit une langue il le fait en postant un formulaire. Filtrer les valeurs reçues et stocker son choix dans une variable de session. C'est également un cookie mais sa valeur est cryptée et uniquement lisible par le serveur.
Modérateur
En même temps généralement le choix de la langue est libre. Si les gens veulent s'amuser à surcharger les cookies pour avoir le site dans une autre langue alors qu'il suffit de cliquer sur le lien…
bazooka07 a écrit :
Rien n'empêche aux visiteurs d'envoyer du code PHP en guise de cookie.

Je ne comprends toujours pas:
Tu peux me donner un exemple de "code vicieux" dans un cookie?
Pour moi, tout ce qu'on peut faire d'un cookie c'est le lire ou l'écrire, ça ne s'exécute pas, sauf à le faire exprès.