[PHP] jazykové mutace přes SESSION
Ahoj, pokouším se dělat stránky s několika zakykovými mutacemi. Doposud jse je dělal přes url adresy a pomocí mod_rewrite. Problém je ale v tom že někdo chce jednojazyčné stránky, někdo zase vícejazyčné. Když vytvořím třeba aktuality pro vícejazyčný web a potřebuju ho použít jen pro jednojazyčný, tak ho musím kompletně ošetřit, tzn. všechny proměnné ve kterých mám překlady vyhodit a napsat to tam na tvrdo. Nebo aktuality nechat pro vícejazyčný web, ale v url adrese bych musel pořád udržovat /cs/, aby se mi do proměnných načítal český text. Napadlo mě proč to neudělat přes session. Sice hledání chyb bude zřejmě složitější, ale mělo by to vyřešit můj problém.
Napsal jsem si kod, který by měl do $_SESSION vložit aktuální jazyk. Chci se zeptat zkušenějších programátorů, zda by to tak mohlo být nebo by kód napsali jinak?
session_start();
if(isset($_GET["lg"])):
$_SESSION["lg"] = $_GET["lg"];
elseif(!isset($_SESSION["lg"])):
$_SESSION["lg"] = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$_SESSION["lg"] = strtolower(substr(chop($_SESSION["lg"][0]),0,2));
elseif(($_SESSION["lg"]<>"cs")&&($_SESSION["lg"]<>"de")&&($_SESSION["lg"]<>"en")):
$_SESSION["lg"]="en";
endif;
require("config".$_SESSION["lg"].".php"); //nahraje se config s aktualni mutaci
Re: [PHP] jazykové mutace přes SESSION
Tak zrovna jazykové mutace jsou docela typický případ pro sessions, vídám to celkem běžně.
Ale ten poslední řádek je cesta do pekla.
Jde o to, že děláš include souboru a nemáš ošetřené, co tam vlastně vkládáš. U tebe je to částečně ošetřené tím prefixem 'config', ale představ si, že by tam ten config nebyl a uživatel by ti v GETu předal adresu svého skriptu. Pokud by bylo povolené vkládání skriptů z URL (viz allow_url_fopen), tak je na bezpečnostní průšvih zaděláno.
Celkově je tohle jeden ze základních bezpečnostních problémů PHP webů, silně doporučuju to buď nějak ošetřit, nebo udělat switch/case a includovat cesty natvrdo.
Edit: Ošetřit by to šlo třeba i tak, že ten poslední elseif předěláš na if, tj. ta kontrola proběhne i když uživatel předá něco v GETu. Možností je samozřejmě víc.
Re: [PHP] jazykové mutace přes SESSION
Já bych se ukládání jazyku do session vyhnul, přece jen když někomu pošlu odkaz tak očekávám že tam uvidí stejný obsah, takhle pokud má nastaven jiný jazyk v prohlížeči… a i vyhledávače by mohly zaindexovat jen jednu jazykovou verzi. Lepší přenášet v URL.
Re: [PHP] jazykové mutace přes SESSION
Jen k ty bezpecnosti, to neni zdaleka jen problem PHP, to je problem naprosto obecnej. Proste nikdy nikde nesmis pouzit v kodu promenou, jejiz obsah muze uzivatel menit. Respektive, nesmis ji pouzit primo. Muzes trebas misto case (coz v pripade desitek/stovek variant je metoda ponekud neschodna a hlavne neudrzovatelna) hrabnout do dany cesty, nacist co tam je a to porovnat s tim co by uzivatel chtel.
Co se mutaci tejce, sem za link na konkretni jazyk. Problem totiz nastane, kdyz nekdo vlozi link na konkretni stranku a (celkem logicky) ocekava, ze cilova osoba to uvidi tak jak to videl on. Kdyz se pak dotycnemu (kvuli jinemu nastaveni prohlizece/proxy/... ) zobrazi neco jineho, vypada to hloupe.
Re: [PHP] jazykové mutace přes SESSION
Podle by bylo nejjednodussi pouzit mod_rewrite.
Udelas pravidlo, abys mel odkaz ve tvaru
www.domena.cz/cz/index.php, coz ve skutecnosti bude www.domena.cz/index.php?lang=cz
Vyhoda je, ze se ti odkazy budou samy prevadet na odkaz s konkretni jazykovou mutaci.
(kdyz v index.php bude odkaz na page.php, tak jelikoz se mu bude zdat, ze je ve slozce cz, tak to udela korektni odkaz na /cz/page.php)
Re: [PHP] jazykové mutace přes SESSION
Ono je vůbec nejlepší používat nějaký chytře navržený framework, třeba v Nette frameworku je tohle otázka dvou řádků kódu → definovat parametr $lang a označit ho za persistentní, tedy všechny odkazy budou tento parametr přenášet.