Critiche sul mio start.php. Un elenco di controlli di avvio

di il
7 risposte

Critiche sul mio start.php. Un elenco di controlli di avvio

Ciao a tutti

Volevo sottoporre alle vostre critiche un mio start.php che io carico in ogni pagina del sito, per chi mi volesse ammazzare di critiche gliene sarei grato
Non è che è troppo pesante da caricare per ogni pagina?? Purtroppo io ho l'ansia di controllo, controllo tutti gli accessi, li registro sul database, cerco di fare controlli incrociati, e sono ossessionati dagli attacchi
ah a proposito, il mio sito non è pubblico, però noto che ci sono continuamente accessi all'index del sito che non conosce nessuno
139.162.116.133
HTTP Banner Detection (https://security.ipip.ne)
138.246.253.24
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb.
13.77.153.138
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36..
sono strapieno di questi... ma cosa sono? sono bot che scannano internet a caso? Perché il mio è un sito prova, non lo conosce nessuno. L'homepage è bianca.
E chissà che magari qualcuno mi ha bucato il sito e io che ne saprò... mah, meglio non pensarci...

Grazie a chi mi dedica parte del suo tempo


require_once($_SERVER["DOCUMENT_ROOT"]."/start/start.php");
start.php parte così
<?php
set_time_limit(0);
require_once("globali.php");
require_once("function.php");
require_once("debug.php");
require_once("db.php");
require_once("session.php");
require_once("access.php");
require_once("protect.php");
?>
globali.php ha semplicemente una serie di variabili globali uguali per tutto il sito, tipo:
$PERCORSO_PRINCIPALE = $_SERVER["DOCUMENT_ROOT"]."/res";
$PERCORSO_FOTO_UPLOAD = $PERCORSO_PRINCIPALE."/".$FOTO_UPLOAD;
ecc ecc

function.php
ha una serie di definizioni di funzioni globali che ogni pagina del sito potrebbe utilizzare (al caricamento non esegue nulla)
funzioni per il controllo esistenza cartelle o file, scrittura di log su file di testo.

debug.php è così. Tramite una determinata funzione, modifico questo stesso file php da un altro file php e sostituisco i true e i false a seconda del caso
<?php
//////////////////////////////////////////////      PANNELLO GENERALE ATTIVAZIONI/DISATTIVAZIONI

define('__DEBUG',                           true);      //true -> testing  
define('__BLOCK_ALL',                       false);
define('__BLOCK_DB',                        false);
define('__BLOCK_PAGE',                      false);
define('__BLOCK_ADDRESS',                   true);
define('__BLOCK_UPLOAD_PHOTO',              false);     //  true per bloccare invio foto
define('__BLOCK_ADDITEMS',                  false);     //  true per simulazione interna
define('__BLOCK_ADDITEMS_EXCEPT_ADMIN',     false);     //  true per inserimento solo ADMIN

//////////////////////////////////////////////      ATTIVAZIONE/DISATTIVAZIONE DEBUG

if(__DEBUG)
    {
        error_reporting(E_ALL);  
        ini_set("display_errors", 1);  
        ini_set("display_startup_errors", 1); 
        ini_set("track_errors", 1);   
        ini_set("log_errors", 1);  
        ini_set("error_log", "/logz.txt");  
        ini_set("log_errors_max_len", 0);  
    }
    else
        {
            error_reporting(0);  
            ini_set("display_errors", 0);  
            ini_set("display_startup_errors", 0); 
            ini_set("track_errors", 0);   
            ini_set("log_errors", 0);  
        }
//////////////////////////////////////////////      ATTIVAZIONE/DISATTIVAZIONE INSERZIONI

if(__BLOCK_ADDITEMS)
    {
        
    }

//////////////////////////////////////////////      INSERIRE MIO IP PER BLOCCARE ACCESSO A TUTTE LE PAGINE
if(__BLOCK_ALL)
    {
        if($_SERVER['REMOTE_ADDR'] != "")   //Inserire il mio ip
            {
                exit();
            }
    }
//////////////////////////////////////////////      BLOCCARE UTILIZZO DB A TUTTI O TRANNE AL MIO IP
if(__BLOCK_DB)
    {
        
    }
//////////////////////////////////////////////      BLOCCARE ACCESSO AD UNA PAGINA IN PARTICOLARE
if(__BLOCK_PAGE)
    {
        if($_SERVER['SCRIPT_FILENAME'] == "")
            {
                exit();
            }
    }
//////////////////////////////////////////////      BLOCCARE UN SINGOLO IP
if(__BLOCK_ADDRESS)
    {
        if(isset($_SESSION['block']) AND $_SESSION['block'] == TRUE)
            {
            echo "bloccato";
                //header("location: "); //reindizzamento homepage
            }
        if($_SERVER['REMOTE_ADDR'] == "")
            {
                exit();
            }
        if($_SERVER['REMOTE_ADDR'] == "" AND $_SERVER['HTTP_USER_AGENT'] == "")
            {
                exit();
            }
    }
//////////////////////////////////////////////      BLOCCARE CARICAMENTO FOTO
if(__BLOCK_UPLOAD_PHOTO)
    {
        
    }
//////////////////////////////////////////////      BLOCCARE INSERIMENTO INSERZIONI
if(__BLOCK_ADDITEMS)
    {
        
    }
//////////////////////////////////////////////      BLOCCARE INSERIMENTO INSERZIONI TRANNE PER LIVELLO 0
if(__BLOCK_ADDITEMS_EXCEPT_ADMIN)
    {
        
    }
?>

db.php ha questo
<?php
$mysqli_connection = mysqli_connect('ip', 'db_m', '!sd@ve?Ry_eP~');
mysqli_query($mysqli_connection, "SET NAMES 'UTF8'");
if(!$mysqli_connection)
	{
		echo "Errore connessione Database. Contattare Amministratore";
        mysqli_close($mysqli_connection);
		exit();
	}
if(!mysqli_select_db($mysqli_connection, "db_mts"))
		{
			echo "Errore Tabella. Contattare Amministratore";
            mysqli_close($mysqli_connection);
			exit();
		}
?>


session.php è così
<?php
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
session_start();
session_regenerate_id();
//////////////////////////////////////////////////////////////  CONTROLLO INATTIVITA' UTENTE    ////////////////////////////////////////////////////////////
if(isset($_GET['check_session']))
    {
        if(isset($_SESSION['username']))
            {
                $active = time()-$_SESSION['timer'];
                if((time()-$_SESSION['timer']) > 1800)
                    {
                        require_once("db.php");
                        require_once("function.php");
                        mysqli_query($mysqli_connection, "UPDATE team SET active = '', online = '' WHERE username = '{$_SESSION['username']}'");
                        auto_logout();
                        $_SESSION = array();
                        echo "Sessione scaduta!";
                        exit();
                    }
            }
    }
//////////////////////////////////////////////////////////////  OPERAZIONI AL LOGIN    ////////////////////////////////////////////////////////////

if(isset($_GET['login']))
    {
        $username = strip_tags(trim(substr($_GET['username'], 0, 16)));
        $password = sha1(sha1(strip_tags(trim(substr($_GET['password'], 0, 16)))));
        if(mysqli_num_rows($result = mysqli_query($mysqli_connection, "SELECT * FROM team WHERE username = '$username' AND password = '$password'"))>0)
            {
                $result_postlogin = mysqli_fetch_assoc($result);
                    $_SESSION['TOT'] =      sha1(sha1(md5($_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['REMOTE_ADDR'])));
                    $_SESSION['id'] =  time();
                    $_SESSION['timer'] =    time();
                    $_SESSION['nome'] =     $result_postlogin['nome'];
                    $_SESSION['username'] = $result_postlogin['username'];
                    $_SESSION['level'] =    $result_postlogin['level'];
                check_folder();
                log_login();

                $q = "UPDATE session SET LOGIN = 'ok', username = '{$_SESSION['username']}' WHERE id = '{$_COOKIE['id']}'";
                mysqli_query($mysqli_connection, $q);
                mysqli_query($mysqli_connection, "UPDATE team SET online = 'on', active = '0' WHERE username = '{$_SESSION['username']}'");
            }
            else
                {
                    if(isset($_SESSION['tent_fail']))
                        {
                            $_SESSION['tent_fail'] = $_SESSION['tent_fail']+1;
                        }
                        else
                            {
                                $_SESSION['tent_fail'] = 1;
                            }
                }
}
//////////////////////////////////////////////////////////////  OPERAZIONI DOPO LOGIN    ////////////////////////////////////////////////////////////

if(isset($_SESSION['username']))
    {                                               //se utente cambia ip o pc o browser
        if($_SESSION['TOT'] != sha1(sha1(md5($_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['REMOTE_ADDR']))))
            {
                $active = time()-$_SESSION['timer'];
                mysqli_query($mysqli_connection, "UPDATE team SET active = '$active', online = '' WHERE username = '{$_SESSION['username']}'");
                $_SESSION = array();
                header("location: homepage");
            }                                       //se utente è inattivo da più di 30min
        if((time()-$_SESSION['timer']) > 1800)
            {
                mysqli_query($mysqli_connection, "UPDATE team SET active = '$active', online = '' WHERE username = '{$_SESSION['username']}'");
                $_SESSION = array();
                header("location: homepage");
            }
        if(!isset($_GET['check_session']))
            {
                $active = time()-$_SESSION['timer'];
                $_SESSION['timer'] = time();                
                mysqli_query($mysqli_connection, "UPDATE team SET active = '$active' WHERE username = '{$_SESSION['username']}'");
            }
    
    ?>
            <?php
				//<script type="text/javascript">
                //require_once($_SERVER["DOCUMENT_ROOT"]."/js/check_session.js");
                //require_once($_SERVER["DOCUMENT_ROOT"]."/js/check_error.js");
				//</script>
            ?>
        
<?php
    }



//////////////////////////////////////////////////////////////  OPERAZIONI AL LOGOUT    ////////////////////////////////////////////////////////////
if(isset($_GET['logout']))
    {
        mysqli_query($mysqli_connection, "UPDATE team SET online = '', active = '' WHERE username = '{$_SESSION['username']}'");
        log_logout();
        $_SESSION = array();
        header("location: homepage");
    }

?>

access.php è così
<?php

if(!isset($_COOKIE['id']))
    {
        $id = substr(md5($_SERVER['REMOTE_ADDR']), 0, 12 );
        $id .= "-".rand(1,10000000);
        setcookie("id", $id, 0, "/", "", FALSE, TRUE);
        new_istance($id);
    }
    else
        {
            new_istance($_COOKIE['id']);
        }

function update_istance($id)
    {
        global $mysqli_connection;
        $timestamp = time();
        $q_update = "UPDATE session SET
            id = '$id',
            data = now(),
            timestamp = '$timestamp',
            REMOTE_ADDR = '{$_SERVER['REMOTE_ADDR']}',
            SCRIPT_NAME = '{$_SERVER['SCRIPT_NAME']}',
            counter = counter+1
            WHERE id = '$id'";
        $result = mysqli_query($mysqli_connection, $q_update);
    }

function new_istance($id)
    {
        $timestamp = time();
        global $mysqli_connection;
        if(__FILE__ == $_SERVER['SCRIPT_FILENAME'])
            {
                $direct = 0;
            }
            else
                {
                    $direct = 1;
                }
        mysqli_query($mysqli_connection, "INSERT INTO session (
            id,
            data,
            timestamp,
            REMOTE_ADDR, 
            HTTP_USER_AGENT, 
            SCRIPT_NAME,
            direct,
            counter,
            cookie
        ) 

        VALUES (
            '$id',
            now(),
            '$timestamp',
            '{$_SERVER['REMOTE_ADDR']}', 
            '{$_SERVER['HTTP_USER_AGENT']}', 
            '{$_SERVER['SCRIPT_NAME']}',
            '$direct',
            '1',
            'OK'
        )");
    }


    
?>

infine protect.php è così
<?php
//require_once($_SERVER["DOCUMENT_ROOT"]."/js/nomousedx.js");
if(!isset($_SESSION['username']) AND strpos($_SERVER['SCRIPT_NAME'], "reserved") AND !strpos($_SERVER['SCRIPT_NAME'], "main"))
    {
        header("location: homepage");
    }
//if(__FILE__ == $_SERVER['SCRIPT_FILENAME'])

if(!isset($_SESSION['username']))
    {
        $pagina_corrente = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
        if($pagina_corrente == "index.php")
            {
                $q = "UPDATE session SET WARNING = 'TRUE' WHERE REMOTE_ADDR = '{$_SERVER['REMOTE_ADDR']}' AND HTTP_USER_AGENT = '{$_SERVER['HTTP_USER_AGENT']}' AND SCRIPT_NAME = '{$_SERVER['SCRIPT_NAME']}'";
                mysqli_query($mysqli_connection, $q);
                header("location: homepage");
                exit();
            }
    }



/////////////////////////////////////////////////////       PERMESSI CARTELLE   /////////////////////////////////////////////////////////////////

if(isset($_SESSION['level']))
    {
        if(
            (strpos($_SERVER['SCRIPT_NAME'], "call")               AND $_SESSION['level'] != 0)                                     OR
            (strpos($_SERVER['SCRIPT_NAME'], "conti")              AND $_SESSION['level'] > 1)                                      OR
            (strpos($_SERVER['SCRIPT_NAME'], "cron")               AND $_SESSION['level'] != 0)                                     OR
            (strpos($_SERVER['SCRIPT_NAME'], "reserved/db")                 AND $_SESSION['level'] != 0)                                     OR
            (strpos($_SERVER['SCRIPT_NAME'], "reserved/profile")            AND !isset($_SESSION['username']))
        ))
                {
                    header("location: homepage");
                }
    }

/////////////////////////////////////////////////////       SEZIONE BLOCCO UTENTE   /////////////////////////////////////////////////////////////////

if(isset($_SESSION['tent_fail']) AND $_SESSION['tent_fail']>5)
   {
        $_SESSION['block'] = TRUE;
        header("location: homepage");
   }
?>

7 Risposte

  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    Ciao,

    il primo indirizzo ip è stato segnalato su AbuseIPDB, 1.014 volte, il secondo 926 volte
    Considerando che non sono reti italiane (il primo è giapponese), ti consiglio di bloccare le rispettive subnet con il firewall modificando l'ultimo ottetto dell'indirizzo ip in "0" e aggiungendo "/24". Ovvero "x.x.x.0/24".
    Detto questo sempre su AbuseIPDB, vengono segnalati 14,533 indirizzi ip/ora - puoi capire quindi che bloccare a manella gli indirizzi ip è un lavoro impossibile.

    Di cosa si tratta:
    Sono bot che eseguono scansioni automatiche per trovare vulnerabilità, comprendere come è organizzato il sito, quali connessioni è possibile sfruttare, porte aperte del firewall, servizi in ascolto, ecc.
    Una volta fatto l'inventario delle debolezze possono poi procedere a sfruttarle a proprio vantaggio.

    Contromisure esterne alla tua applicazione:
    - Web Application Firewall meglio se collegato a servizi di check IP addresses (può essere interno al tuo cloud o esterno es. Cloudflare)
    - Fail2Ban o sistemi simili
    Detto questo, la tua applicazione deve implementare codice sicuro.

    Per quanto riguarda il codice postato, ecco le prime cose che ti segnalo:
    1. Il blocco ip, come lo hai pensato, non ha senso. Inoltre è un antipattern inserire dati (es. indirizzi ip) in un codice di programmazione. A limite devi usare un file esterno di configurazione.
    Anche il db.php... la pasword del database va messa in un file esterno di configurazione
    2. Per la password vedo "$password = sha1(sha1(". Roba di altri tempi. Devi usare altro algoritmo di derivazione e aggiungere un salt random.
    Ecco qui: https://www.php.net/manual/en/function.password-hash.php
    Consiglio ARGON2I / ARGON2ID
    3. Le query e i parametri. Devi usare Prepared statement:
    https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

    Direi che adesso hai un po' di carne al fuoco
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    Grazie mille, c'è molto arabo per me in ciò che hai scritto ma mi segno tutto e piano piano vedrò.
    Per adesso inserendo l'ip del server nel browser, quell'index, non ha nulla. Ci ho messo solamente <?php ?>
    Tutte le altre pagine sono in cartelle, e nessuna ha però un index.php quindi credo, o spero, che siano difficili da trovare.
    Bisognerebbe fare tanti tentativi... e se anche qualcuno dovesse trovarle, se non c'è una SESSION rimanda all'ip del server.

    L'argomento della sicurezza mi interessa molto ma ci sono anche un sacco di cose da conoscere... bisognerebbe essere un hacker per sapersi difendere bene...

    Forse dovrò studiarmi come funziona apache, perché da quel poco che ho intuito gran parte delle cose che ho scritto in php potrei farle fare ad apache, tipo blocco ip, accessi alle cartelle ecc ma ora come ora non so farlo.

    Cosa significa
    è un antipattern inserire dati (es. indirizzi ip) in un codice di programmazione. A limite devi usare un file esterno di configurazione.
    anti pattern?
    Cosa intendi per "esterno"? Esterno nel senso fuori dalla directory principale? Nelle cartelle indietro al root?

    Quei 2 link poi me li leggerò con calma perché sono in lingua aliena per me.

    Comunque ho un server dedicato di aruba, quello base da 30 euro al mese.
    Spero che nel mentre che io impieghi tempo a imparare, loro abbiano i loro sistemi di difesa...
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    Antipattern: https://it.wikipedia.org/wiki/Anti-patter
    Nel caso specifico: Valori cablati - hard code: inserire costanti nel codice piuttosto che in file di configurazione;

    Riguardo al server dedicato che a quel prezzo immagino sia un vps, considerando che sei alle prime armi, ti consiglierei di optare per un servizio di web hosting.
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    La cosa più grave è questa.
    mysqli_query($mysqli_connection, "UPDATE team SET active = '', online = '' WHERE username = '{$_SESSION['username']}'");

    Cosa succede se il mio username è ';drop table team; ?
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    Al secondo posto (dopo PDO con statement preparati) ci metterei sanitizzazione brutale sia degli input che delle letture dal database.
    ma tanto brutale.

    gli aspetti di "stile" (tipo file parametri con le password) sono molto meno importanti, anzi, paradossalmente non è sempre detto sia cosa buona e giusta mettere tutte le password in singolo file bello bello (tipo wordpress per capirci).

    ma sono inezie
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    +m2+ ha scritto:


    La cosa più grave è questa.
    mysqli_query($mysqli_connection, "UPDATE team SET active = '', online = '' WHERE username = '{$_SESSION['username']}'");

    Cosa succede se il mio username è ';drop table team; ?
    Bisogna conoscere però il nome della tabella... però se la si conoscesse hai ragione, mi cancellano tutto
  • Re: Critiche sul mio start.php. Un elenco di controlli di avvio

    Toki ha scritto:


    Antipattern: https://it.wikipedia.org/wiki/Anti-patter
    Nel caso specifico: Valori cablati - hard code: inserire costanti nel codice piuttosto che in file di configurazione;

    Riguardo al server dedicato che a quel prezzo immagino sia un vps, considerando che sei alle prime armi, ti consiglierei di optare per un servizio di web hosting.
    Non è un vps, è un server dedicato
    è questo qui
    https://serverdedicati.aruba.it/server-dedicati/basic-2-5
Devi accedere o registrarti per scrivere nel forum
7 risposte