PHP / Cookies

Här diskuteras PHP, Perl och mm sånt som rör webutveckling.
Post Reply
nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

PHP / Cookies

Post by nightcrawlr54 » 12 November 2009, 16:25

Jag har ett lustigt problem, som säkert är jätteenkelt, men jag lyckas inte få det att fungera.

När jag går in på min sida, så blir den helt blank, om man uppdaterar 1 gång så fungerar allt som det ska.
Felet jag får i error_log är:

"PHP Notice: Use of undefined constant "


såhär ser min kod ut:

<?php
if (!isset($_GET['lang'])){
setcookie("lang", "sv");
} else {
setcookie("lang", $_GET['lang']);
}

if (isset($_COOKIE['lang'])) {
$kaka=$_COOKIE['lang'].".php";
require($kaka);
}

if (!isset($_GET['page'])){
$page='start';
} else {
$page=$_GET['page'];
}
?>

efter detta så är all html/php-kod för sidan.

Jag vill att "kakan" ska laddas innan resten av sidan visas, men det verkar inte gå !

Snälla hjälp mig, tack

nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

Re: PHP / Cookies

Post by nightcrawlr54 » 13 November 2009, 16:06

Löste det tillslut.

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: PHP / Cookies

Post by erik_persson » 6 December 2009, 01:19

nightcrawlr54 wrote:
if (isset($_COOKIE['lang'])) {
$kaka=$_COOKIE['lang'].".php";
require($kaka);
}
Det där är ett säkert sätt att skaffa sig säkerhetsproblem.

/erik

nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

Re: PHP / Cookies

Post by nightcrawlr54 » 7 December 2009, 12:02

Med risk för att verka dum, men hurdå? :)

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: PHP / Cookies

Post by erik_persson » 12 December 2009, 03:06

nightcrawlr54 wrote:Med risk för att verka dum, men hurdå? :)
Du låter klienten, genom att skicka en cookie (eller genom att använda get-requesten), välja vilken kod som ska köras på servern. Dvs klienten kan köra vilken php-kod som helst som finns på servern (om den användare som kör php kan läsa denna), om inte safe_mode används.
Minsta problem eller sätt att komma runt din konkatenering med ".php", skulle dessutom göra att avändaren skulle kunna läsa precis vilken fil som helst på servern, som webservern (eg den användare som php-scriptet körs som) kan läsa (med samma safe_mode restriktion som anges ovan).

I din kod ovan så sätter du en cookie, vilket innebär att du sätter en header som ska skickas tillbaka till klienten. Efter de raderna så har du inte ändrat värdet av cookien som klienten sände till dig! Klienten kan ha sänt precis vad som helst. Dessutom, klienten kan ha angivit vad som helst i get-requesten (så det spelar inte ens speciellt stor roll).

Ha som princip att ALLTID KONTROLLERA INDATA från klienten. Den enda gång du *inte* ska göra det, är om du VET att indata inte kan påverka något och aldrig kommer att kunna göra det.

Att inte rensa indata är ett klassiskt problem och ger sql injection-attacker, cross site scripting-attacker och i andra fall riskerar att någon kan läsa filer som ligger på webservern, vilket kan resultera i att lösenord kan hittas.

Antag tex att du på något annat ställe tillåter, eller kommer att tillåta, att någon laddar upp saker till din server, tex en liten bild. Personen kan då istället ladda upp ett php-script som läser filer och kataloger (dvs en liten filhanterare - lätt att göra i php). Personen kan då tex läsa de filerna där du har information om databaslösenord eller liknande.

Obs för övrigt att safe_mode kommer att tas bort ur php, om du hade planerat att använda det som en långsiktig lösning.

/ep

nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

Re: PHP / Cookies

Post by nightcrawlr54 » 14 December 2009, 18:08

Okej, tack för inputen !! Om jag lägger till en case-sats, skulle det räcka i din mening?

Code: Select all

if (!isset($_COOKIE['lang'])) {
	require("sv.php");
	$lang="sv";
} else {
	$kaka=$_COOKIE['lang'].".php";

switch($page)
{
case "sv":
        require($kaka);
        break;
case "no":
        require($kaka);
        break;
default:
        echo "nu gör du nåt fult....";
}
som ett exempel.. oerhört tacksam för dina svar

nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

Re: PHP / Cookies

Post by nightcrawlr54 » 14 December 2009, 18:09

switch($kaka) ska det såklart vara, skrev lite fort =))

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: PHP / Cookies

Post by erik_persson » 15 December 2009, 01:28

nightcrawlr54 wrote:switch($kaka) ska det såklart vara, skrev lite fort =))
Ja, det räcker (du gjorde ett skrivfel och glömde ".php" som suffix i switch-satsen).
När du gjort ovan *vet* du att det som du har fått är ok!

Ett tips är att inte göra kontrollen "after the fact" utan så tidigt som möjlig.
Nu kontrollerar du egentlingen inte indata utan något som är deriverat från indata. Principiellt är det naturligtvis ok, men det gör att du riskerar att glömma att kontrollera indata igen ("det är ju redan kontrollerat") om du skulle använda indata på ett annat ställe.
Var gränsen går mellan indata och deriverad data är naturligtvis flytande, och man behöver inte vara så strikt som jag är nedan (ex om man kör $lang = $_GET['lang'] så kan man se $lang som deriverad, eller kanske som tillräckligt nära orginalet om man är säker på att inte använda GET-lang-variabeln mer).

Ett exempel som gör det lite mer modulärt, där du tex kan lägga saker i en php-fil som du kan inkludera, är att göra något liknande tex:

$okLang['sv'] = "sv.php"; // eller satt till vad som helst
$okLang['en'] = "en.php";
$okLang['dk'] = "..."

if ( ! isset($okLang[$_GET['lang']]) ) {
$_GET['lang'] = "Error.php"; // ingen risk att vi senare använder data skickat av klienten
$lang = "sv"; // default lang
}
else
$lang = $_GET['lang'];

require($lang . ".php");

/ep

nightcrawlr54
Posts: 25
Joined: 3 April 2009, 14:50

Re: PHP / Cookies

Post by nightcrawlr54 » 15 December 2009, 10:11

Jättetack!! Känner att jag kanske borde börja plugga lite php-säkerhet.
Har hela tiden bara lärt mig att få allt att fungera, men helt struntat i säkerheten.
Det fungerade ju förr när man endast programmerade för eget bruk, men vill man sedan göra hemsidor åt andra kan ju sånt här vara vettigt, till exempel. :)
Tack än en gång.

Post Reply