Ciao,
Io ti posso dire come faccio io, ho un progettino mio personale strutturato in model, view, controller, MVC, penso come hai fatto anche tu, non so però se la struttura è uguale, nella view ho tutti i file .php che includono solamente la classe template che mi serve per creare i template, non c'è codice di logica o espressioni di programmazione, ma solamente l'istanziamento della classe ed il passaggio delle variabili alla pagina HTML per creare l'html, i file HTML sono dentro una sottocartella nella view l'utente inserisce nome e password, con una chiamata Ajax invio i parametri al model al file configLogin.php...
Config Login non fa altro che prendere le variabili utente e password istanzia una classe ed invoca il metodo convalidaLogin..
Codice PHP:
security_session();
$utente = new utente();
$convalidaLogin = new convalidaLogin();
$userGet = $utente->recuperaUser();
$passGet = $utente->recuperaPass();
$convalidaLogin->convalidaLogin($userGet, $passGet);
Codice PHP:
class utente {
private $username;
private $password;
public function __construct(){
$userGet = trim($_POST['username']);
$passGet = trim($_POST['password']);
$this->username = $userGet;
$this->password = $passGet;
}
public function recuperaUser(){
return $this->username;
}
public function recuperaPass(){
return $this->password;
}
}
class convalidaLogin extends utente{
function __construct(){
parent::__construct();
}
public function convalidaLogin($userGet, $passGet){
//error_reporting(E_ALL);
$username = $userGet;
$password = $passGet;
if( !isset($userGet) || empty($userGet) || trim($userGet)=='')
{
$msg = "|";
$msg .="USER_VUOTO";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
if(!isset($passGet) || empty($passGet) || trim($passGet)=='')
{
$msg = "|";
$msg .="PASS_VUOTA";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
//Apriamo il Db PhpMyAdmin
$db = new connessione();
$db = $db->apriConnessione();
//Caso errore connessione
if ($db->connect_error) {
$msg = "|";
$msg .= "ERRORE_CONNESSIONE"."|";
$msg .= "Impossibile connettersi a MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
$sql = $db->prepare("SELECT * FROM utenti WHERE username = ?");
$sql -> bind_param('s', $username);
$username = trim($userGet);
$password = md5($passGet);
$sql->execute();
$sql->store_result();
$sql->bind_result($id, $usernameDB, $profiloDB, $passwordDB);
$sql->fetch();
if ($sql->num_rows == 1){
if(checkAssalto($id) == true) {
$msg = "|";
$msg .="ACCOUNT_DISABILITATO";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
else{
if ($password == $passwordDB && strcmp($username, $usernameDB) == 0){
//------------------------VALORI DELL'UTENZA-----------
$user_browser = $_SERVER['HTTP_USER_AGENT'];
$idUtente=$id;
$profilo=$profiloDB;
$username = $usernameDB;
$stringaLogin = hash('md5', $passwordDB.$user_browser);
//------------------------------------------------------
$datiUtente = array('idUtente'=>$idUtente,
'username'=>$username,
'profilo'=>$profilo,
'stringaLogin' => $stringaLogin);
$_SESSION['datiUtente']=$datiUtente;
$msg = "|";
$msg .="OK";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
else {
// Password incorretta.
// Registriamo il tentativo fallito nel database.
$now = time();
$db->query("INSERT INTO miatabella (user_id, time) VALUES ('$id', '$now')");
$msg = "|";
$msg .="TENTATIVO_FALLITO";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
}
}
else{
$msg = "|";
$msg .="UTENTE_ASSENTE";
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
}
//------------------
//Chiude Mysql DB
$db->close();
exit;
}
}
iMPORTANTE è la funzione check assalto in poche parole dopo 5 tentativi falliti blocco l'utenza per evitare gli assalti al DB che posso sbloccare solamente dal DB di altervista, le funzioni check assalto e la sessione sono definite nel file funzioni del MODEL..
Codice PHP:
function security_session(){
$session_name = 'login_webLog'; // Imposta un nome di session
$secure = false; // Imposta il parametro a true se vuoi usare il protocollo 'https'.
$httponly = true; // Questo impedirà ad un javascript di essere in grado di accedere all'id di sessione.
ini_set('session.use_only_cookies', 1); // Forza la sessione ad utilizzare solo i cookie.
$cookieParams = session_get_cookie_params(); // Legge i parametri correnti relativi ai cookie.
session_set_cookie_params(0);
session_name($session_name); // Imposta il nome di sessione con quello prescelto all'inizio della funzione.
session_start(); // Avvia la sessione php.
session_regenerate_id();
}
//Check il login e reindirizza dalle pagine di View
function checkLogin(){
$server = $_SERVER['HTTP_HOST'];
if (!isset($_SESSION['datiUtente'])) {
echo('Non sei loggato, clicca il link sottostante per loggarti :' . '<br>');
print("<a href='http://$server/MvcWebLog/view/login.php'>Login</a>");
exit ;
}
}
//Dopo 5 tentativi falliti con un nome username blocca l'utenza sbloccabile solo da DB
function checkAssalto($id) {
//Recupero il timestamp
$now = time();
//Apriamo la connessione al DB
$db=new connessione;
$db = $db->apriConnessione();
// Vengono analizzati tutti i tentativi di login a partire dalle ultime due ore.
$valid_attempts = $now - (2 * 60 * 60);
if ($stmt = $db->prepare("SELECT time FROM MIATABELLA WHERE user_id = ? AND time > '$valid_attempts'")) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->store_result();
//Se ci sono più di 5 tentativi dallo stesso ID return false e blocco
if($stmt->num_rows > 5) {
return true;
} else {
return false;
}
}
}
Ovviamente la check LOGIN è inclusa nel controller, tutte le informazioni passano dal Controller che le smista al Model, il model ha una sequenza in autoload spl_autoload_register ogni chiamata invocata da index.php invia al controller che a sua volta dirotta al model il quale effetua anch'esso un controllo e dinamicamente cerca il metodo corrispettivo nel model, ogni azione corrisponde ad un METODO nel model, se l'azione non esiste il model risponde azione errata...tutta la struttura è così, nel model ci sono metodi, che vengono poi invocati esempio da questa dicitura:
http://fractalcosmo.altervista.org/M...p/azione=prova
prova corrisponde ad un metodo nel file incluso nella cartella model, dentro la cartella model c'è il cuore del progetto, quindi tutto l'interfacciamento con il DB, nel model non ci sono molti file ma due file e dentro questi due file c'è una classe che include i metodi che vengono invocati dinamicamente dall'autoload, non ho fatto 50 file nel model, io in questo modo a progetto ingrandito se devo capire in quale punto del progetto devo intervenire so già che ogni volta che invoco da Ajax azione=MIAAZIONE, ed includo il file del model, so già che dovrò andare in quel file al metodo che si chiama MIAAZIONE..non so se è sicuro al 100% ma per il momento sembra che non me l'hanno bucato :)
Un link interessante dove io ho appreso l'idea del checkAssalto è questo link:
http://it.wikihow.com/Creare-uno-Scr...do-PHP-e-MySQL
Ciao