webForumDet fria alternativet

Ingen direkt åtkomst?

8 svar · 485 visningar · startad av Hamatzu

HamatzuMedlem sedan mars 2005232 inlägg
#1

Hej igen!

Jag har suttit och klurat lite med det här att man inte ska kunna ha någon åtkomst till filer som man inte har inkluderat genom index.php.

Jag tänkte om det kanske fanns någon funktion, typ "if not included, redirct" eller liknande.

Någon som har några förslag? :bire

KrikoMedlem sedan dec. 2006382 inlägg
#2

Säg att du har något sådant här i din index.php:

...
include("inc/" . ( isset($_GET['page']) ? $_GET['page'] : "start" ) . ".inc.php");
...

Då kanske man kan lägga till något sådant här i varje fil som ska inkluderas:

if(@$_GET['page'] != "filnamnet") {
    ob_flush();
    header("Location: index.php");
    exit;
}

Det här går naturligtvis att spinna vidare på, men det är iaf en början som du kanske har nytta av, vad vet jag. =)
Berätta gärna hur du löste det till slut. =)

HamatzuMedlem sedan mars 2005232 inlägg
#3

Kriko skrev:

Säg att du har något sådant här i din index.php:

...
include("inc/" . ( isset($_GET['page']) ? $_GET['page'] : "start" ) . ".inc.php");
...

Då kanske man kan lägga till något sådant här i varje fil som ska inkluderas:

if(@$_GET['page'] != "filnamnet") {
    ob_flush();
    header("Location: index.php");
    exit;
}

Det här går naturligtvis att spinna vidare på, men det är iaf en början som du kanske har nytta av, vad vet jag. =)
Berätta gärna hur du löste det till slut. =)

Jag har inte riktigt den uppbyggnaden på hemsidan, jag har allt innehåll i en databas. Och det jag inkluderar är typ standard-filer, såsom page.php, menu.php och liknande.

Jag har kommit en liten bit på vägen:

    
    include("config.php");
    $dh = opendir(_SITE_FULL_DIR);
    
    if ($dh) {
        while ($file=readdir($dh)) {
    
                if($file=="." || $file==".." || $file=="index.php") 
								{	}
                else 
    						{
                		$file2[] = $file;    
                }
        }
        closedir($dh);
    }
    
    $page_file = basename($_SERVER['REQUEST_URI']); 
    
    if(in_array($page_file, $file2))
    {
    	header("Location: " ._SITE_DIR);
    }

Jag har lagt denna kod i en egen fil som jag inkluderar på varje sida längst upp , som jag vill att man inte ska ha direkt åtkomst till. Det jag gör är att jag öppnar och loopar alla filer i den mapp som hemsidan ligger i, sedan kollar jag om nån fil är lika med "index.php". Om någon fil är lika med "index.php" så händer ingenting, annars kollar jag om filen som man gått till finns i arrayen för alla filer som jag loopat från mappen. Om filen som man går till finns i arrayen rederictas man till startsidan.

....blev lite luddigt i slutet, men, men. :birp

Det enda problemet med detta blir om du ska ha filer som man inte får komma åt i några undermappar.

KrikoMedlem sedan dec. 2006382 inlägg
#4

Du får göra det rekursivt...

$files[] = Array();
function loopDir($startDir) {

    while($file = readdir($startDir)) {

        if(($file != "." || $file != ".." || $file != "index.php") && is_dir($file) {

            loopDir(_SITE_FULL_DIR . "/" . $startDir . "/" . $file);

        } else {

            $files[] = $file;

        }

    }

    closedir($startDir);
    $page_file = basename($_SERVER['REQUEST_URI']);
    if (in_array($page_file, $files)) header("Location: " ._SITE_DIR);

}

Något sådant kanske?
Har inte provat koden, det var bara något jag svänga ihop lite snabbt.

HamatzuMedlem sedan mars 2005232 inlägg
#5

hmm, det vill sig inte riktigt. Hur ska jag använda funktionen som du skrivit?

spangoMedlem sedan juni 20008 205 inlägg
#6

Att hålla på och rekursera genom katalogstrukturer är inte att rekommendera, det är ruskigt långsamt. Enklaste vore att inkludera filer som ligger utanför webbroten. Annars kan du kolla SCRIPT_NAME eller nåt liknande.

if ($_SERVER['SCRIPT_NAME'] == '/index.php') {
    // sidan är inkluderad genom index.php
}
HamatzuMedlem sedan mars 2005232 inlägg
#7

Fungerade klockrent! Tack! :birp

Nu när man ändå är igång, kunde man ju kanske passa på att fråga hur man kan göra samma sak med mappar? Alltså att man inte ska kunna komma åt t.ex. en mapp som heter includes.

spangoMedlem sedan juni 20008 205 inlägg
#8

Inte genom PHP, men genom webbserverns konfig ska det gå bra. Kör du IIS har jag ingen aning om hur du gör, med Apache blir det någonting med Deny i httpd.conf eller .htaccess, se http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#deny

HamatzuMedlem sedan mars 2005232 inlägg
#9

Det där säger mig tyvärr inte speciellt mkt. Någon som har gjort något liknande och kan ge en lite mer utförlig förklaring och kanske ett exempel? :)

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)