[php] include alleen uit eigen site

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
Ik heb hier gezocht, op google en op php.net maar niets tot mijn tevredenheid gevonden.

Ik heb in een php script een variabele die ik inlcude volgens: include("$content"); Op deze manier is het mogelijk om externe scripten uit te voeren, middels http://andereurldandievanmij.nl/script.php oid. De provider vind dit niet goed omdat zo de servers kunnen worden misbruikt.

Is er een manier om dit tegen te gaan, kan ik bijvoorbeeld mijn script zo instellen dat er alleen wordt geinclude als het bestand op mijn site staat.

En dan zonder dat ik mijn eigen url noem in de variabele.

Ik heb het nu opgelost door "./" ervoor te zetten maar ik vroeg mij af of er nog andere mogelijkheden zijn.

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • phYzar
  • Registratie: November 2001
  • Laatst online: 13:33
zet alle bestanden van jezelf die je wilt includen in één map. Zet in de variabele alleen de naam van het bestand (dus "bestand" ipv "/pad/naar/bestand.php"
En dan voordat je include

$content = "bestand"
$content = "/vast/pad/naar/" . $content . ".php";

je kunt eventueel tekens die je niet in je bestandsnaam wilt hebben strippen zoals slashes.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Uberhaupt moet je nooit spul direct uit de url zo gaan lopen includen zonder een check of het wel een geldige include is. Dat is gewoon vragen om problemen.

Beter is zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$allowed_includes = array (
   'content1.php',
   'content2.php',
   'content3.php'
);

if (isset ($_GET['content']) && in_array ($_GET['content'], $allowed_includes)) {
   include ($_GET['content']);
} else {
   include ($allowed_includes[0]);
}

[ Voor 10% gewijzigd door Bosmonster op 24-02-2004 09:43 ]


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Kijk eens naar de tips op de php site.
If "URL fopen wrappers" are enabled in PHP (which they are in the default configuration), you can specify the file to be included using a URL (via HTTP or other supported wrapper - see Appendix J for a list of protocols) instead of a local pathname.
De oplossing van phYzar kan je nog verbeteren door een andere extensie dan php te gebruiken. Die kan je dan zelfs zo "htaccessen" dat Apache ze nooit opstuurt mochten ze direcht aangevraagd worden.

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
OK, bedankt, dat is idd een manier, maar ik vroeg mij af of je in je script niet een één of andere omgevingsvariabele kan instellen (de include_dir) of zo zodat voor alle includes geldt dat zij alleen kunnen icluden als het bestand in mijn directory op de server staat.

[edit]
OK, nu staan er nog meer reacties, jullie zijn snel :) Ik ga even één en ander proberen, maar mij ./ ervoor werkt toch ook of zijn daar ook bezwaren tegen?

[ Voor 24% gewijzigd door Pin0 op 24-02-2004 09:54 ]

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • phYzar
  • Registratie: November 2001
  • Laatst online: 13:33
Pin0 schreef op 24 februari 2004 @ 09:48:
OK, bedankt, dat is idd een manier, maar ik vroeg mij af of je in je script niet een één of andere omgevingsvariabele kan instellen (de include_dir) of zo zodat voor alle includes geldt dat zij alleen kunnen icluden als het bestand in mijn directory op de server staat.
Waarom heel het pad opgeven als het eerste stuk steeds hetzelfde (verplicht) is, namelijk jouw directory op de server? Kun je net zo makkelijk dat stuk er zelf voor zetten. En zoals bosmonster al zegt: nooit zomaar dingen direct includen aan de hand van wat de bezoeker/gebruiker opgeeft.

Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
Zie mijn bewerkte (vorige) reply

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Hoewel het wel goed is om te weten hoe je dit soort dingen door configuratie kunt voorkomen is het nog beter als je je script gewoon dichttikt. Dat kun je door Bosmonster's manier doen, maar ik vind het altijd een beetje zonde om een array te bouwen van files die je toch al in een bepaalde directory hebt staan ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
// filter bestandsnaam
$file = preg_replace ( '/[^.a-z0-9_-]+/i', null, $_GET [ 'file' ] );

// genereer relatief pad
$path = sprintf ( './inc/%s.php', $file );

// check of het bestand bestaat en een file is.
if ( !is_file ( $path ) ) {
   // zo niet, 404
   Header ( "HTTP/1.0 404 File not found" );
   exit ();
}
// anders: includen
include ( $path );
?>

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Vold
  • Registratie: September 2001
  • Laatst online: 22-01 23:04
Ik gebruik nu dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$StandaardMap = "php/"; 
$StandaardExtensie = ".php";  

if($id) { 
    $id = strtolower($id); 
    $id = htmlspecialchars($id);
    if(strstr($id,"admin") || strstr($id,"index") || strstr($id,"..")) { 
        echo "Er is iets fout gegaan"; } 
        elseif(file_exists("$StandaardMap$id$StandaardExtensie")) {                  
                                include("$StandaardMap$id$StandaardExtensie"); } 
        elseif(file_exists("$StandaardMap$id")) { include("$StandaardMap$id"); } 
    else { echo "Er is iets fout gegaan"; } } else {


Is dit een beetje veilig ? En is het misschien handig op hier superglobals te gebruiken ?

[ Voor 31% gewijzigd door Vold op 24-02-2004 11:43 ]

Pagina: 1