• User Newbie

    Quale è il modo più sicuro di impostare un CMS per un sito in PHP MySQL e jQuery

    Salve a tutti!
    Sto creando un sito di fotografie dotato di CMS per caricare le foto e gestire gli utenti (ogni foto può essere commentata solo se sei un utente registrato) e mi trovo di fronte a un problema:

    quale è il modo migliore di proteggere le pagine del CMS e alcune sezioni del sito in modo da renderle visibili SOLO all'amministratore del sito e non a tutti gli utenti?

    Ho cercato molto "login sicuro in php" in google ma ogni tutorial propone un metodo diverso (ed es, usare cookies o variabili di sessione, o addirittura usare un .txt per conservar username e password degli iscritti... boh).

    Il punto è che il login al sito è una pagina unica con il suo jQuery e PHP script in $.post(); e non mi piace l'idea di mettere nel php script una

    if ($row['user'] == 'admin') { $_SESSION['user'] = 'admin'; }

    e richiamare nelle pagine una

    if ($_SESSION['user'] == 'admin') { ..mostra contenuto...}

    Che alternative ho?

    Ringrazio in anticipo,

    Francesco


  • User Attivo

    Ciao, ti do alcune best practice

    1. Utilizza HTTPS, niente pagine su HTTP!
    2. Salva le password utente in un database, mai in un file di testo!
    3. Non salvare le password utente in chiaro nel DB, piuttosto salva gli hash con una funzione di hashing sicura (Es. bcrypt o Argon2, in PHP c'è password_hash() per generare un hash).
    4. Per ogni pagina protetta, in cui avrai session_start(), fai un check su una variabile di sessione inizializzata durante il login utente, aggiungi un controllo anche sull'IP utente e uno sul browser (sempre salvati al momento del login in variabili di sessione), infine se consenti all'utente loggato di fare operazioni di scrittura sul database utilizza un token di sessione (previene attacchi di tipo CSRF).

    In materia di sicurezza applicazioni web una delle risorse migliori e più autorevoli è senza dubbio OWASP, ti incollo di seguito il link riguardo l'autenticazione

    owasp.org/index.php/Authentication_Cheat_Sheet


  • User Newbie

    Grazie flaviors200!
    Appena riesco guardo il link...
    Due domande veloci intanto:
    Come uso HTTPS invece di HTTP?
    Cosa è un token di sessione?


  • User Attivo

    @areFranz said:

    Come uso HTTPS invece di HTTP?

    Installa un certificato SSL/TLS

    @areFranz said:

    Cosa è un token di sessione?

    owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Token_Based_Mitigation

    Esempio veloce:

    [HTML]
    <form action="modifica.php" method="post">
    <input type="hidden" name="token" value="58jfdk3830">
    <input type="text" name="card_number">
    <input type="submit" name="save" value="Salva">
    </form>
    [/HTML]

    Il token è un valore casuale che inserisci in un campo hidden del tuo modulo, e lo imposti come variabile di sessione (Es. $_SESSION['token'])

    Lato server confronti il valore del campo nascosto con quello salvato nella variabile di sessione, solamente se coincidono la richiesta è valida.

    [PHP]
    <?php
    if (isset($_POST['save'])) {

      if ($_SESSION['token'] != $_POST['token']) {
    
          echo "Richiesta non valida";
    
      } else {
    
          echo "Richiesta valida";
          // salva i dati
    
      }
    

    }
    [/PHP]

    Il motivo per cui si utilizza è dato dal fatto che io potrei duplicare la tua sessione, ma dato che il token è generato sul server difficilmente io (il client) ne posso conoscere il valore.


  • User Newbie

    Ok il sito dispone già di un certificato SSL, quindi sono apposto no?
    Mentre ok per il token anche se non mi è chiarissimo, cercherò in google...
    Ma la cosa più importante è:

    è davvero buona pratica inserire un check tipo:

    if ($_SESSION['user'] == 'nome_super_utente') { ... mostra contenuto protetto ... }

    ?


  • User Attivo

    La buona pratica sarebbe quella di studiarsi le buone pratiche 😄

    Se il sito dispone di un certificato assicurati almeno di reindirizzare l'utente ad HTTPS. Ti lascio questa risorsa servermanaged.it/blog/certificati-ssl/#I_Certificati_SSL_best_practices_dopo_linstallazione

    Per quanto riguarda PHP invece ti consiglio questa preziosa risorsa che raccoglie tutte le migliori pratiche da seguire per chi sviluppa in PHP it.phptherightway.com

    Ad ogni modo proteggere un contenuto riservato verificando solamente il valore di una variabile di sessione non è una buona pratica.

    Come ti ho detto dovresti daree un check su ulteriori valori per aumentare la sicurezza, l'IP e il browser utente sono due esempi.

    Avevo già in mente di scrivere un tutorial sul mio blog riguardo il login in PHP, appena trovo un pò di tempo lo faccio e aggiorno questo post.


  • User Newbie

    Bene, grazie mille della risposta...
    Nella attesa del tuo tutorial, consulterò le guide che mi hai indicato!


  • User Newbie

    Hei! Alla grande! Ho inserito il file .htaccess et voila! Ora fa refirect su https!
    Mentre sono un po perplesso sulla check di IP e browser:
    dove imposto i loro valori e come ne faccio il check?


  • User Newbie

    Scusa, ho capito come fare il check su IP e browser.. MA

    stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php

    Quale delle soluzioni posso usare?


  • User Newbie

    Scusami ancora, non ho capito come assegnare il valore del token e dove farlo...