Avatar billede hugo78 Nybegynder
18. oktober 2007 - 14:37 Der er 19 kommentarer

Hjælp! Min side er blevet misbrugt eksternt - validering ønskes!

Mit website er blevet lukket ned fra udbyders side fordi der har foregået misbrug, og eksterne har kunne sende mails, ved at bruge den include funktion jeg bruger i min index.php fil. Hos supporten siger de at der mangler input validering, og at jeg skal sørge for at det kun er filer på mit eget domæne der må includeres og ikke eksterne. Koden ser sådan ud nu:

<?    if ( $fil == '' ){
include "main/main.html";
}else{
include $fil;
}
?>

Hvad gør jeg?? er i tvivl om hvordan jeg skriver at det kun er fra fx http://www.minside.dk/indhold/

at der må includeres fra når man klikker på et link fra sitet.

Håber der er nogen derude der kan hjælpe mig så mit site kan få lov at gå online igen.

Mange tak!
Avatar billede dkfire Nybegynder
18. oktober 2007 - 15:01 #1
Er det hele din index fil ???
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 15:04 #2
Hej

Nej nej så ligger der jo også tables og normal html, men det er i en table at det script ligger. Ikke andet php.
Avatar billede dkfire Nybegynder
18. oktober 2007 - 15:15 #3
Hmm okay ikke særlig smart php.
Hvordan ser dine links ud ??
Og hvor meget php kan du ?
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 15:20 #4
Nej ok.. det tænkte jeg nok.. men det har jo virket enkelt og godt ind til nu. Jeg er grafiker, og ikke proggramør, men har tillært mig en del.

Mine links ser fx sådan ud: <a href="?fil=content/profil.html">PROFIL</a>
Avatar billede sherlock Nybegynder
18. oktober 2007 - 15:26 #5
Hvis du tester for at der ikke er "//" i $fil, kan du ikke include fra en ekstern server.
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 15:28 #6
Ok perfekt. Og hvordan skrives det så det virker?
Avatar billede dkfire Nybegynder
18. oktober 2007 - 15:29 #7
Den eneste og nemmest løsning jeg lige kan komme på er:

<?php

$fil = $_GET['fil'];
switch ($fil) {
  case "content/profil.html":
      include("content/profil.html");
      break;
  case "mappe/fil.html":
      include("mappe/fil.html");
      break;
  default :
      include("main/main.html");
}

?>

Du kan selv tilføje flere case alt efter hvor mange links du har.
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 15:39 #8
Ok super tak. Det er måske en metode. Når der er få links på siden, men vel ikke når der er rigtig mange. Så vil index filen blive meget lang og man skal derfor huske at opdatere den hver gang man laver et link på siden.

Sherlock: Hvordan tester jeg for at der ikke er //?
Avatar billede sherlock Nybegynder
18. oktober 2007 - 15:42 #9
:) Jeg kender INTET til php ?!
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 15:49 #10
hehe ok men tak for rådene!

Jeg må i tænkeboks. Er begyndt at bruge ssi istedet for php til at lave website includes. Måske skulle jeg fortsætte med det.
Avatar billede dkfire Nybegynder
18. oktober 2007 - 16:00 #11
Det kan du gøre ved:

<?php
  if( isset($_GET['fil']) && strpos($fil, "//") === FALSE )
  {
    include($_GET['fil']);
  }else
  {
    include("main/main.html");
  }
?>

Men jeg er ikke sikker på det er sikkert nok, men det er nok lettere for dig.
Du kan læse mere om strpos her:
http://dk2.php.net/manual/da/function.strpos.php
Og om switch her:
http://dk2.php.net/manual/da/control-structures.switch.php
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 16:01 #12
Ok, helt super. Det ligner mere noget jeg kan arbejde videre med. Mange tak for hjælpen indtil videre!
Avatar billede woowii Nybegynder
18. oktober 2007 - 22:48 #13
Endnu bedre - lav en whitelist. I stedet for at sætte en masse cases kan du blot lave et array (eller en tabel i din DB, så den er lettere at administrere) og derefter tjekke om siden brugeren prøver at hente rent faktisk er lovlig.

Brugere har f.eks. også mulighed for at gå tilbage i dine mapper via URLen hvis du overhovedet ikke validerer det han skriver, så han vil kunne få fat i filer som han ikke burde kunne få fat i - kort sagt er der en milliard ting du kan blackliste, derfor bør du whiteliste i stedet og blackliste alt andet. Det er den eneste holdbare metode.
Avatar billede hugo78 Nybegynder
18. oktober 2007 - 23:09 #14
Ok interessant. Hvordan skriver jeg det?
Avatar billede woowii Nybegynder
18. oktober 2007 - 23:28 #15
Det kommer jo helt an på om du vil sætte det i din index fil eller om du vil hente det fra databasen - første tilfælde sætter du et array som du tilføjer værdier til - andet tilfælde indsætter du værdier i din DB. I begge tilfælde skal du naturligvis tjekke om den værdi brugeren giver dig findes i array/DB (altså om brugeren må inkluderer siden).

Begge metoder enkle hvis du har en nogenlunde kendskab til PHP - jeg bruger selv DB, fordi jeg godt kan lide at kunne administrere så meget så muligt online. Hvis du vil have hjælp til at lave det må du være lidt mere specifik, f.eks. mht. hvilken metode du ønsker - så kan jeg godt give dig et hurtigt eksempel. :)
Avatar billede hugo78 Nybegynder
19. oktober 2007 - 00:06 #16
Jeg kører ikke med nogen database, men bruger include funktionen på en del sites, så jeg er meget interesseret i at få en nem og mere sikker løsning. Fx direkte i index filen. Jeg vil meget gerne se et eksempel. Er ikke php haj, desværre :)
Avatar billede woowii Nybegynder
19. oktober 2007 - 00:39 #17
$allowed = array();
$allowed[] = "kontakt";
$allowed[] = "info";

if(in_array($_GET['page'],$allowed))
{
    include $_GET['page']".php";
}
else
{
    include "index.php";
}


Er en mulighed - i simpel form. :)
Avatar billede woowii Nybegynder
20. oktober 2007 - 15:03 #18
Respons? :)
Avatar billede hugo78 Nybegynder
21. oktober 2007 - 15:25 #19
Nu har jeg prøvet med det script der tester ved //. Så må jeg se om hosting stedet godkender at det vil virke. Ellers må jeg arbejde med de arrays. Igen mange tak for alle rådene.
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