- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Quale è il modo più sicuro di impostare un CMS per un sito in PHP MySQL e jQuery
-
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
-
Ciao, ti do alcune best practice
- Utilizza HTTPS, niente pagine su HTTP!
- Salva le password utente in un database, mai in un file di testo!
- 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).
- 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
-
Grazie flaviors200!
Appena riesco guardo il link...
Due domande veloci intanto:
Come uso HTTPS invece di HTTP?
Cosa è un token di sessione?
-
@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.
-
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 ... }
?
-
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.
-
Bene, grazie mille della risposta...
Nella attesa del tuo tutorial, consulterò le guide che mi hai indicato!
-
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?
-
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?
-
Scusami ancora, non ho capito come assegnare il valore del token e dove farlo...