webForumDet fria alternativet

"Säkerhetshål" i index-filen...

PHP

3 svar · 515 visningar · startad av cosmic

Medlem sedan apr. 20071 inlägg
Frågan#1

Ny här... men hoppas på hjälp.

Jag är inte så överdrivet high på PHP, men har gjort några sidor med det, med grund i en gammal site som jag tog över. Nu har två av dessa siter blivit hackade med ett par månaders mellanrum och den senaste har nu stängts ner på grund av att index.php-filen innehåller en "säkerhetsrisk", enl webbhotellet.

Vad göra? Jag kan inte särskilt mycket PHP som sagt och att lösa det här är långt, långt över min förmåga.

Jag antar att hålet ligger i följande:

PHP-delen i headern:

<?PHP
$sidan = $_GET['link'].'.php';

if ($sidan==".php") {
$sidan = "start.php";
}

//print $sidan;
?>

...och PHP-delen i body:

<?include($sidan);?>

Flera av mina siter är uppbyggda på samma sätt, så vill ni se så kolla källkoden på min egen site.

Om någon vill/kan hjälpa blir jag så glad...
/Camilla

Medlem sedan feb. 20034 441 inlägg
#2

Nu är inte jag hundra på hur include() funkar rent säkerhetsmässigt i PHP, men enl. den där principen är det möjligt att ange:

http://www.dittdomän.se/index.php?link=http://www.google.se

Då kommer ev. google att inkluderas på din sida.

Om nu inte webhotellet eller möjligen funktionen i sig har ett skydd emot detta.

Det kanske kan vara smart att med ifsatser eller switch() el. liknande kolla värdet i $link och kolla om filen finns i din rotmapp, innan du inkluderar den:

$link = $_GET['link'] . ".php";
$exec = "false";
if(!isset($link)){
  $link = "start.php";
  $exec = "true";
}else{  
   if($link) == "sida2.php"){
     $exec = "true;"
   }else if($link == "sida3.php"){
     $exec = "true";
   }
}
if(isset($exec) && $exec = "true"){
   include($link);
}else{
   die("sidan finns inte...";
}

Finns säkert många andra och bättre sätt att lösa det här på, men här är ett förslag.

Medlem sedan feb. 20034 441 inlägg
#3

Ett till exempel:

$filename = $_GET['link'] . "php";
if(isset($filename) && file_exists($filename)){
    include($filename);
}else{
   die("filen finns inte på den här servern...");
}

Det här sättet är finare och kollar dessutom så att filen som ska inkluderas verkligen finns.

/r
Kollade din sida lite hastigt, du verkar ha egna <head></head> taggar i undersidorna:

....
</td>
                <td width="6" background="pics/dot.jpg" bgcolor="#ffffff">&nbsp;</td>
                <td width="675" valign="top" bgcolor="#D6DBDE"> 
                  [b]<head>[/b]
<SCRIPT LANGUAGE="JavaScript">
<!-- Idea by:  Nic Wolfe (Nic@TimelapseProductions.com) -->
<!-- Web URL:  [url]http://fineline.xs.mw[/url] -->

<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!! [url]http://javascript.internet.com[/url] -->

<!-- Begin
function popUp(URL) {
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width=400,height=500,left = 440,top = 262');");
}
// End -->
</script>
<link href="style.css" rel="stylesheet" type="text/css">
[b]</head>[/b]
<link href="text.css" rel="stylesheet" type="text/css"> <title>V&auml;lkommen</title><body bgcolor="#FFFFFF" link="#574D37" alink="#403621" vlink="#403621">

<link href="style1.css" rel="stylesheet" type="text/css"> 
<table width="691" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" background="pics/b
....

Det har inget med säkerheten att göra direkt, men är fel ;)
lägg javascript och <link> taggar högst upp i huvuddokument istället, för du kan inte ha fler headtaggar i samma dokument, kolla din källkod så förstår du vad jag menar.

Medlem sedan jan. 20023 327 inlägg
#4

En annan lösning kan ju vara att ha alla sidor du tillåter i en array och sedan kolla mot denna. Men jag tycker MickeA.com redan har visat bra lösningar.

256 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)