Problema con Get page

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.
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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.
 

Gumbo

Nuovo Utente
1 Set 2020
3
0
1
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>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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:

Gumbo

Nuovo Utente
1 Set 2020
3
0
1
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
Autore Titolo Forum Risposte Data
G Problema con home page HTML e CSS 4
L Grande problema con fronte page!!!!! HTML e CSS 0
O problema con dvr dahua xvr5116 IP Cam e Videosorveglianza 0
G Problema con Xampp Web Server 1
andrea barletta Problema con miniature comandi Photoshop 0
I problema con alice Posta Elettronica 0
N Problema con position absolute e overflow HTML e CSS 4
L Problema con inner join PHP 11
K [php] Problema con inner join PHP 4
K [PHP] Problema con variabili concatenate. PHP 1
O problema con query PHP 4
I problema con 2 account Posta Elettronica 1
L problema collegamento file css con html HTML e CSS 1
E Problema accesso a file con app sviluppata con MIT APP INVENTOR 2 Sviluppo app per Android 0
M Problema con Try Catch PHP 0
Sergio Unia Problema con gli eventi del mouse su una data table: Javascript 2
T PROBLEMA CON SESSIONI PHP 3
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
R problema con else PHP 0
T PROBLEMA CON ARRAY PHP 8
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
F Problema con risposta PHP 0
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
L Problema RAM con Tomcat 8 Apache 0
napuleone problema con sort e asort PHP 4
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
M Problema con controllo form in real time jQuery 6
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
P Problema con require once PHP 6
P Problema con i package Java 1
A Problema login con Safari PHP 14
F INDESIGN: problema esportazione esecutivo per la stampa con foto B/N Webdesign e Grafica 0
S problema con css bootstrap3 HTML e CSS 4
M .load() problema con caricamenti dinamici di js Javascript 0
G Problema con eccessiva nitidezza apertura Camera Raw Photoshop 0
G Problema ------- con Query PHP 1
G Problema con Query PHP 1
T problema con select dinamica con jquery Javascript 0
S Problema con spazi bianchi HTML e CSS 5
A PROBLEMA: insert mysqli con dati Tagsinput Presentati al Forum 0
Tommy03 Problema con z-index HTML e CSS 3
M Problema inserimento parole con apostrofo nel db PHP 5
C Problema con dati meteo xml XML 1
S Problema con infrarossi videocamera IP Cam e Videosorveglianza 1
V Problema con librerie allegro5 c++ C/C++ 1
M Problema con php per calcolo costo percentuale PHP 7
S Problema con mysqli_num_rows PHP 18

Discussioni simili