Problema con Get page

  • Creatore Discussione Creatore Discussione Gumbo
  • Data di inizio Data di inizio

Gumbo

Nuovo Utente
1 Set 2020
3
0
1
Salve a tutti,

ho implementato un semplice sito con caricamento dinamico di pagine e blocchi mediante php.

Nella pagina index.php ho inserito la funzione

PHP:
<?php $page = ($_GET['page']) ? $_GET['page'] : "home.php"; ?>

e piu in basso nella pagina

PHP:
<?php include($page); ?>

So che questo non è sicuro ma non ho avuto problemi per molti anni fino a che la vulnerabilità è stata scoperta.
Vorrei dei consigli su come risolvere il problema modificando lo script semplicemente ed in maniera sicura.

Ho trovato in rete un vecchio post del 2006 che suggerisce la seguente soluzione:


PHP:
 // initialize page variable
$page = (!empty($_GET['page'])) ? $_GET['page'] : 'home';

// pick a page
switch ($page) {

case 'home': /* home page stuff */ break;
case 'products': /* */ break;
case 'about-us': /* */ break;

// don't accept any other values
default: /* error 404 for example */
}

Mi sembra che sia abbastanza semplice e che possa fare al caso mio, ma non mi è chiaro dove inserire tutto quello che segue //pick a page, cioè se nella pagina in questione devo sostituire la mia stringa
PHP:
<?php include($page); ?>

con

PHP:
// pick a page
switch ($page) {
case 'home': /* home page stuff */ break;
case 'products': /* */ break;
case 'about-us': /* */ break;
// don't accept any other values
default: /* error 404 for example */
}

o comunque come fare per adattare questo script alla mia pagina

Non posso chiedere delucidazioni all'autore del post, in quanto il thread è chiuso (sicuramente a causa del fatto che è molto vecchio).
Altre soluzioni di facile implementazione che vorrete suggerire saranno comunque benvenute e ringrazio fin da ora chi vorrà intervenire nella discussione aiutandomi a risolvere questo problema.
 
Significa il valore è idoneo solo dopo averlo controllato altrimenti hacker.
case confronta il valore con una lista da te scritta e dopo i : verrà eseguito il codice se non ottieni alcuna corrispondenza userà il default e : eseguito con ciò che scrivi.
Ad eccezione del default dovrai impostare in ogni case include($page); mentre sul default la pagina 404 generalmente è non trovata.
Se la variabile $page ha il valore home includi home con il codice da te proposto.
 
Significa il valore è idoneo solo dopo averlo controllato altrimenti hacker.
case confronta il valore con una lista da te scritta e dopo i : verrà eseguito il codice se non ottieni alcuna corrispondenza userà il default e : eseguito con ciò che scrivi.
Ad eccezione del default dovrai impostare in ogni case include($page); mentre sul default la pagina 404 generalmente è non trovata.
Se la variabile $page ha il valore home includi home con il codice da te proposto.

Scusa la mia ignoranza. ho capito come funziona lo script, ma non ho capito come inserirlo nella pagina.
Non vorrei abusare della tua pazienza ma se potessi postare la stringa da inserire (e dirmi dove inserirla) mi sarebbe di enorme aiuto.

Di seguito il codice dell'intera pagina:

Codice:
<?php $page = ($_GET['page']) ? $_GET['page'] : "home.php"; ?>

<?php include('contactform_script.php'); ?> <!-- script per inviare mail tramite il form nella pagina "contacts" -->

<!-- <!DOCTYPE html> -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<html>
<head>
  
  <meta charset="UTF-8">
  <title>Titolo</title>

  
  
  <link rel="stylesheet" href="css/style.css" type="text/css">

</head>

<body style="color: rgb(0, 0, 0);" alink="#ee0000" link="#0000ee" vlink="#551a8b">
<div class="background">
<div class="page">

<!-- Header --> 
<?php include('en/blocks/header.php'); ?>

<!-- Cont -->
<?php include($page); ?>

<!--  Sidebar -->
<?php include('en/blocks/sidebar.php'); ?> 

<!--  Footer  -->
<div class="footer">

<!-- Menu Footer -->
<?php include('en/blocks/footer.php'); ?>

<!-- Menu social -->
<?php include('en/blocks/social.php'); ?>

</div>
</div>
</div>
<script>
var coll = document.getElementsByClassName("collapsible");
var i;

for (i = 0; i < coll.length; i++) {
  coll[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}
</script>
</body></html>
 
Rileggi bene usa la funzione trova del tuo browser per il carattere : di ogni case. Lì dovrai inserire il codice da eseguire.
Mentre lo switch($page) significa parsa il valore di quella variabile e lo confronta con il testo contenuti nel case.
PHP:
$page = (!empty($_GET['page'])) ? $_GET['page'] : 'home.php';
$a = true;

// pick a page
switch ($page) {
case 'home.php': include($page); break;
case 'products.php': include($page); break;
case 'about-us.php': include($page); break;
// don't accept any other values
default: /* error 404 for example */ unset($_GET['page'], $page); $a = false; break; //cancello le variabili non sono previsti nella lista precedente
}
if(!$a){
//sono sul default
}

//per la home.php dopo lo switch se arriva al default devo ricreare la variabile $page
if(!isset($page)) {
$a = true;
$page = 'home.php';
}

PHP:
<?php $page = (!empty($_GET['page'])) ? $_GET['page'] : 'home.php'; ?>

<?php include('contactform_script.php'); ?> <!-- script per inviare mail tramite il form nella pagina "contacts" -->

<!-- <!DOCTYPE html> -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<html>
<head>
 
  <meta charset="UTF-8">
  <title>Titolo</title>

 
 
  <link rel="stylesheet" href="css/style.css" type="text/css">

</head>

<body style="color: rgb(0, 0, 0);" alink="#ee0000" link="#0000ee" vlink="#551a8b">
<div class="background">
<div class="page">

<!-- Header -->
<?php include('en/blocks/header.php'); ?>

<!-- Cont -->
<?php
switch ($page) {
case 'home.php': include($page); break;
case 'products.php': include($page); break;
case 'about-us.php': include($page); break;
// don't accept any other values
default: /* error 404 for example */ unset($_GET['page'], $page); $a = false; break; //cancello le variabili non sono previsti nella lista precedente
}

?>

<!--  Sidebar -->
<?php include('en/blocks/sidebar.php'); ?>

<!--  Footer  -->
<div class="footer">

<!-- Menu Footer -->
<?php include('en/blocks/footer.php'); ?>

<!-- Menu social -->
<?php include('en/blocks/social.php'); ?>

</div>
</div>
</div>
<script>
var coll = document.getElementsByClassName("collapsible");
var i;

for (i = 0; i < coll.length; i++) {
  coll[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}
</script>
</body></html>
Cioè come ti avevo indicato in precedenza in questo messaggio, https://forum.mrw.it/threads/problema-con-get-page.56921/post-218738
 
Ultima modifica:
Ho aggiornato la pagina come consigliato da Hormus che ringrazio infinitamente rimpiazzando il codice vulnerabile
PHP:
<?php include($page); ?>
con
PHP:
<?// pick a page
switch ($page) {
case 'home.php': include($page); break;
case 'home.php': include($page); break;
case 'folder/page1.php': include($page); break;
case 'folder/folder/page10.php': include($page); break;
case 'folder/folder/page11.php': include($page); break;
// don't accept any other values
default: /* error 404 for example */ unset($_GET['page'], $page); $a = false; break; //cancello le variabili non sono previsti nella lista precedente
}?>
<?if(!$a){
//sono sul default
}?>

<?//per la home.php dopo lo switch se arriva al default devo ricreare la variabile $page
if(!isset($page)) {
$a = true;
$page = 'home.php';
} ?>



Sembra funzionare, in quanto se clicco nel menu su un link che non ho ancora inserito nella lista dei "casi" la pagina non viene caricata nel template. Devo aggiungere un "caso" ogni volta che si crea una nuova pagina ma dato che questo succede due tre volte l'anno, non è un grosso problema.
Anche se sembra funzionare per favore verificate la sintassi, perchè dato che ho dovuto suddividere lo script in piu parti per farlo funzionare potrei avere fatto qualche errore con le parentesi ecc.

Adesso una ulteriore questione...cercando una soluzione al problema mi sono imbattuto in questo thread


dove si consiglia di "sanificare" gli script di questo tipo onde evitare traversing del file system, cosa che deve essere successa sul mio sito dato che l'hacker e riuscito ad entrare nella mia cartella di origine.
Non so se lo script che consigliano per effettuare questa sanificazione sia necessario nella mia pagina, visto lo script che ho inserito, e nel caso DOVE ESATTAMENTE andrebbe inserito.
Non se nemmeno se pposso sanificare l'elemento "/" visto che alcune pagine elencate nei casi sono contenute in folders e subfolders, come nel caso di
PHP:
case 'folder/folder/page11.php': include($page); break;
 

Discussioni simili