Avatar billede wosylus Nybegynder
08. oktober 2006 - 13:42 Der er 18 kommentarer og
1 løsning

Hjemmeside bliver hacked

Hej

Jeg har i den senere tid oplevet, at på sider, hvor jeg bruger nedenstående index.php, bliver siden ofte hacked, og der bliver eksempelvis lagt en eller anden Muhammed-relateret side ind som index. Da jeg ikke lige er superskarp til php ved jeg ikke, hvordan det kan lade sig gøre.

Er der nogen der kan se, hvad der er gør dette muligt? Og hvordan jeg kan forhindre det?

<?php
$side = "";
  if ($_REQUEST["side"]) {
      $side = $_REQUEST["side"];
  }
?>
<html>
<head>
    <title>Eksempel.dk</title>
    <LINK REL="stylesheet" HREF="fonts.css" TYPE="text/css">
</head>

<body>

<TABLE>
  <TR>
      <TD>
      <?php
    include("top.php");
      ?>
      </TD>
  </TR>
  <TR>
      <TD>
      <?php
    include("menu.php");
      ?>
      </TD>
      <TD>
      <?php
      if (!$side) {                          $side='forside.php';
            }
          include($side);
        ?>
      </TD>
  </TR>
  <TR>
      <TD>
          <?php
      include("nyheder.php");
      ?>
      </TD>
  </TR>
</TABLE>

</body>
</html>
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 13:49 #1
Ja, det er farligt at sige

    include($side);

uden at tjekke, at det er en af dine egne sider. Det er forhåbentlig ikke noget, du er blevet anbefalet.
Avatar billede wosylus Nybegynder
08. oktober 2006 - 14:35 #2
Jeg har i hvert fald fået hjælp til at lave det, så det kan man vist godt sige, at jeg er blevet anbefalet. Er der en forholdvis simpel måde at slippe udenom problemet på?
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 14:40 #3
Ja, du skal for det første nok ikke få hjælp sammensted fra en anden gang...

Dernæst skal du tjekke, at det er din egen side, og ikke en "http://....", for der kan problemet komme. Hvad kan din $side typisk indeholde?
Avatar billede wosylus Nybegynder
08. oktober 2006 - 15:06 #4
Giver lige et eksempel på menuen i det nedenstående. Så den indeholder kun de forskellige sider med indhold jeg har. Selve de forskellige sider indeholder stort set kun HTML.

<TABLE WIDTH="100%" CLASS="menu" ALIGN="center" VALIGN="middle">
  <TR>
      <TD>
      Menu
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=forside.php';">
      Forside
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=galleri.php';">
      Galleri
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=links.php';">
      Links
      </TD>
  </TR>
</TABLE>
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 15:26 #5
Jo, men hvad indeholder variablen $side typisk? Hvilke filnavne har du? Det er bare så nogen kan lave et præcist tjek for lovlige sider.
Avatar billede wosylus Nybegynder
08. oktober 2006 - 15:52 #6
Okay... Skal som sådan kun bruge disse 4 filnavne i $side: forside.php, galleri.php, links.php, samt kontakt.php.

Var det dét du mente, så?
Avatar billede mccookie Seniormester
08. oktober 2006 - 16:38 #7
Hej mester

Kender det problem og det er noget værre møg.....

Du kan lave en masse snedigt med noget reg.exp. som du så lige skal fatte og her kan du tilmed også ende ud i at de måske overser lidt.

Jeg har stået med samme problem og løste det på følgende måde.

<?php
$side = md5($_REQUEST['side']);

switch ($i) {
case '9525da429cd73e9f41073977822824ee': // Svarer til md5(forside.php)
  echo "forside";
  break;
case fa3ac215444e9d549c70debe36414a30: // Svarer til md5(galleri.php)
  echo "galleri";
  break;
default:
  echo "i is not equal to 0, 1 or 2";
}
?>

osv. osv.

Er man haj kunne løsningen også være reg.exp men ovenstående kan brugeren ikke sende dig almuligt skrammel  ;)

McCookie
Avatar billede mccookie Seniormester
08. oktober 2006 - 16:38 #8
default:

her kan du vise brugeren hvad du nu ønsker ;)
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 17:30 #9
Hvis du kun har de 4, så kan du, som mccookie antyder, bare teste for dem. md5 gør det nu ikke et hak mere sikkert, kun mere besværligt for dig. Du kan endda spare ".php":  ?side=galleri

witch ($i) {
case 'forside': include('forside.php');  break;
case 'galleri': include('galleri.php'); break;
default:
  include 'forside.php';
}
?>
Avatar billede wosylus Nybegynder
08. oktober 2006 - 19:27 #10
Ja, jeg har netop kun de 4, men har uheldigvis brug fra at få det skåret endnu mere ud i pap :( Da det vist ser ud til at noget af din kode ikke kom med i kommentaren, kan det da passe at det skal se sådan ud?:

<? side=galleri
switch ($i) {
case 'forside': include('forside.php');  break;
case 'galleri': include('galleri.php'); break;
case 'links': include('links.php'); break;
case 'kontakt': include('kontakt.php'); break;
default:
  include 'forside.php';
}
?>


Skal if-sætningen øverst i filen stadig være der? Og hvordan skal link'ene i menuen da se ud?
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 19:36 #11
Jeg ved ikke hvad du mener med
  side=galleri
Og ja, der manglede noget. If-sætningen gør ingen skade. Prøv det.
Avatar billede wosylus Nybegynder
08. oktober 2006 - 19:48 #12
Det var vist også noget vrøvl... Siden loader fint, men hvordan skal links'ene i menuen se ud i stedet for:

onClick="parent.location.href='index.php?side=forside.php';">

Jeg takker utroligt mange gange for hjælpen!
Avatar billede wosylus Nybegynder
08. oktober 2006 - 20:26 #13
Lige nu, er det kun den der står som default der loades uanset hvad...
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 21:10 #14
Som jeg skrev, sådan ca.


onClick="parent.location.href='index.php?side=galleri';">
Avatar billede mccookie Seniormester
08. oktober 2006 - 21:10 #15
den eneste grund til at jeg bruger md5() er for at slippe for at bøvle med evt. fjollet input fra brugere der roder med adresselinien.

Men var jeg mester i reg.exp. så brugte jeg det ;)

McCookie
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 21:20 #16
Det gør jo netop ingen forskel med md5 i de eksempler vi er nået frem til. Så hvorfor bruge det?
Avatar billede wosylus Nybegynder
08. oktober 2006 - 21:28 #17
Uheldigvis loader den default-siden lige meget hvad. Adresselinien skifter godt nok til eksempelvis "..../index.php?side=galleri", men indholdet på siden er stadig default-sidens indhold. Koden ser nu således ud:

Index:

<?php
$side = "";
  if ($_REQUEST["side"]) {
      $side = $_REQUEST["side"];
  }
?>

<html>
<head>
    <title>Eksempel</title>
    <LINK REL="stylesheet" HREF="fonts.css" TYPE="text/css">
</head>

<body>

(...........)

<?php
switch ($i) {
case 'forside': include('forside.php');  break;
case 'galleri': include('galleri.php'); break;
case 'links': include('links.php'); break;
case 'kontakt': include('kontakt.php'); break;
default:
  include 'forside.php';
}
?>

(............)
</body>

Menuen:

<TABLE WIDTH="100%" CLASS="menu" ALIGN="center" VALIGN="middle">
  <TR>
      <TD>
      Menu
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=forside';">
      Forside
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=galleri';">
      Galleri
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=links';">
      Links
      </TD>
  </TR>
  <TR>
      <TD ALIGN="left" onClick="parent.location.href='index.php?side=kontakt';">
      Kontakt
      </TD>
  </TR>
</TABLE>
Avatar billede erikjacobsen Ekspert
08. oktober 2006 - 23:07 #18
Du skal jo heller ikke bruge variablen $i - vi har kun givet dig en skitse til løsning ;)
Avatar billede wosylus Nybegynder
09. oktober 2006 - 17:45 #19
Nu fik jeg det til at virke :) Variablen skulle selvfølgelig være $side. Mange tak for hjælpen, især også til erikjacobsen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester