- Home
- Categorie
- Coding e Sistemistica
- PHP
- [Tutorial] Area privata
-
Ciao a tutti,
so che è una discussione vecchia, ma l'ho appena riesumata. Ho un problema con la pagina login (e tutte le pagine che usano il comando header).
Premetto che sono un neofita autodidatta... In pratica un disgraziato.
Il problema è che non funziona il redirect. So che non dovrebbe esserci nessun output prima del comando header, infatti ho fatto una prova con il semplice header tra i tag php è funziona.Possibile che non ci sia una soluzione? Mi sembra impossibile? C'è qualche errore nelle pagine scritte da Thedarkita? Non posto i codici della pagina tanto sono assolutamente identici a quelli originali scritti. Ho solo modificato i nomi dei campi secondo le mie esigenze (dovevo adattarlo ad una tabella DB già esistente).
Ulteriori info:
Il login funziona, anche se non parte il redirect, se inserisco infatti a mano l'indirizzo della pagina index mi restituisce i link alla pagina "privata.php" e "logout.php". Anche la pagina logout funziona. La tabella è corretta (uso la stessa tabella per un'altra pagina, ma sto facendo delle prove su altri file per implementare in futuro il codice".Ciao e grazie
-
Strano, io ricordo che funzionava bene, anche con i redirect (anche perché quello è il codice per avviarli).
Stai usando un browser su desktop per i test, o uno smartphone (potrebbe non supportare i redirect...)?Sicuro che non ci sia alcun output? Anche, ad esempio, il tag "<html>" è già un output. Il file deve iniziare con <?php e non ci deve essere alcun echo, print e simili.
-
Ciao Gigi991, grazie per la prontezza... Diciamo che sono sicuro non ci sia nessun output, ma potrei sbagliarmi, è un giorno è mezzo che mi ci arrovello sopra, per altri motivi, e quando si passa tanto tempo così sullo stesso codice è facile che scappino delle virgole... Magari provo a postare i codici delle pagine:
pagina config.php
<?php // avvio la sessione session_start(); // Dati connessione al database $db_host = '********'; $db_utente = '********'; $db_password = '********'; $db_nomedb = 'amminis3_cond'; // Effettua la connessione al database $dbh=mysql_connect ($db_host, $db_utente, $db_password) or die (mysql_error()); mysql_select_db($db_nomedb); ?>
pagina login.php
<?php // Includo la connessione al database require 'config.php'; // Se il modulo viene inviato... if(isset($_POST['login'])) { // Dati Inviati dal modulo. Metto nella variabile 'cf' il dato inviato dal modulo, di default uso '' $cf = (isset($_POST['cf'])) ? trim($_POST['cf']) : ''; // Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza if (!get_magic_quotes_gpc()) { $cf = addslashes($cf); } // Controllo l'utente esiste $query = mysql_query("SELECT id FROM condominii WHERE cf = '$cf' LIMIT 1"); // Se ha trovato un record if(mysql_num_rows($query) == 1) { // prelevo l'id dal database $login = mysql_fetch_array($query); // Creo una variabile di sessione $_SESSION['login'] = $login['id']; // reindirizzo l'utente header('Location: privata.php'); //echo 'Hai inserito il codice fiscale '.$cf.', relativo all\'id '.$login['id'].''; exit; } // se non esiste da l'errore else die('Codice fiscale errato'); } ?> <!DOCTYPE html PUBLIC etc..."> <html xmlns="etc..."> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Delli Carri | amministrazione immobili</title> <link href="../css/style.css" rel="stylesheet" type="text/css" /> <link href="../css/menu.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script> </head> <body id="home"> <div id="container"> <?php include '../menu.php' ?> <div id="condominii"> <p> <br /> Benvenuto! Tramite questa pagina sarà possibile raggiungere e visualizzare alcune informazioni relative al suo condominio. In particolare sarà possibile visualizzare il modulo relativo al trattamento dei dati sensibili. <br /><br /> Per visualizzare le informzioni relative al suo condominio è necessario conoscere il codice fiscale del proprio condominio. <br /><br /> Se conosce il codice fiscale lo inserisca qui sotto, altrimenti contatti il suo amministratore, anche tramite l'apposito modulo nella pagina "<a id="link" href="Vecchio/Mail/mail.php">contatti</a>"<br /> <br /><br /> </p> <form action="" method="post"> <input name="cf" type="text" id="cf" value="Codice Fiscale" onfocus="if(this.value=='Codice Fiscale') this.value='';" /><br /><br /> <input name="login" type="submit" id="login" value="Continua" /><br /> </form> </div> </div> </body> </html>
-
Certo, inserisci pure il codice. Ricordo i miei primi giorni su questo codice, anche per me non era semplice.
Prova ad aggiungere
ob_start();
subito dopo <?php
-
Ciao Gigi, ho provato la tua soluzione (premesso che non conoscevo la funzione ob_start). Effettivamente, documentandomi poteva essere una soluzione. Purtroppo però il risultato è deludente. In caso di input errata (pwd o quel che sia sbagliato) tutto funziona e ricevo l'allert, in caso di input corretto si apre la pagina giusta, ma non recupera i dati dal database (cosa che invece prima faceva).
Che barba!!
-
Temo che il problema posso essere la pagina privata... Ora la ricontrollo bene, e a scanso di equivoci la posto qui sotto (ovviamente tagliata nelle parti inutili). Chissà che magari qualcuno trova l'errore prima di me e ci metto 1/4 del tempo a risolvere!
Cmq con ob_start() tutti i redirect hanno ripreso a funzionare... GRAZIE!!!
PS: L'HTML originale è sicuramente corretto, può darsi che nel fare i vari tagli per semplificare il codice possa aver fatto qualche casino. Il succo è che non mi
[PHP]
<?php
ob_start();
// Includo la connessione al database
require('config.php');
// Se non è stata definita la variabile manda l'utente alla homepage
if(!isset($_SESSION['login'])) {
header ('Location: index.php');
exit;
}
?>
<!DOCTYPE html PUBLIC etc...">
<html xmlns="etc...">
<head>
etc...
</head>
<body id="home">
<div id="container">
<?php include '../menu.php' ?>
<div id="condominii">
<?php
$cf = $_POST['cf'];
// Query per ottenere la lista utenti
$query = "SELECT * FROM condominii WHERE cf = '$cf'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
?>
<table style="width: 100%">
<tr>
<td>
<br />
</td>
</tr>
<tr>
<td style="width: 328px">condominio <?php echo $row['nome']; echo "<br />"; ?><?php echo $row['indirizzo']; ?><br/>
<?php echo $row['cap']; ?> <?php echo $row['citta']; ?> (<?php echo $row['provincia']; ?>)<br />Cod. Fisc. <?php echo $row['cf']; ?>
</td>
<td class="style3">
<p>Codice per la Protezione dei Dati Personali</p>
<span class="style4">Informativa sui trattamenti</span>
</td>
</tr>
</table>
<table style="width: 100%">
etc... (il principio è uguale a sopra)
</table>
</div>
</div>
</body>
</html>
[/PHP]
-
Posto qui la soluzione nel caso qualcuno riscontrasse i miei stessi problemi da novellino!
-
Soluzione al redirect, come ci insegna il buon gigi991 è usare il comando [PHP]ob_start()[/PHP] subito dopo la chiamata [PHP]<?php[/PHP]
-
Soluzione all'invio dell'input è modificare la pagina "login.php", ovvero nella porzione del form è meglio puntare direttamente alla pagina "privata.php" segue codice:
[HTML]
<form action="privata.php" method="post"> <input name="cf" type="text" id="cf" value="Codice Fiscale" onfocus="if(this.value=='Codice Fiscale') this.value='';" /><br /><br /> <input name="login" type="submit" id="login" value="Continua" /><br /></form>[/HTML]- Rimandare tutti i controlli di sessione e login direttamente alla pagina "privata.php".
Ciao a tutti e ancora grazie!
-
-
Ciao Rapide,
per caso provavi in locale? O su un hosting windows?
-
Ciao Thedarkita,
provavo su hosting linux. Perché? potrebbe fare la differenza? Ad ogni modo Ora funziona tutto... Anche se sto cercando di implementare una funzione per ora con scarsi risultati...
-
E' un comportamento anomalo quello che hai, bisognerebbe cambiare la configurazione per abilitare la visualizzazione standard degli errori, per verificare che non hai qualche errore generato che ti crea quel problema.
Su parecchi ambienti windows un po' di anni fa capitavano spesso problemi simili.
-
Scusa, ma diventa già troppo tecnico per me
Ad ogni modo uso come registrar netsons.com, da anni e... Devono aver cambiato loro qualche configurazione, perché fino a qualche tempo fa lo stesso script funzionava senza problemi... Bah
-
Ciao a tutti, sono di nuovo qui!
Non sono sicuro sia la sessione giusta, ma tra le migliaia di discussioni non riesco a trovarne una più indicata. La domanda che devo fare è molto semplice, ben altro sarà invece la risposta TEMO...Una volta entrati nell'area riservata, se clicco "indietro" usando i pulsanti del browser, compare pagina bianca e mi chiede di riconfermare l'invio del modulo. E' sempre stato così, che io sappia, però rispetto alle nuove esigenze del sito che ho costruito, mi piacerebbe capire se esiste una soluzione per ovviare a questo problema. Anche perché da qualche tempo Chrome fa comparire una pagina bianca e riapre la pagina interessata solo dopo un refresh e la conferma del reinvio del modulo: OVVERO ESATTEMENTE QUELLO CHE NON FAREBBE MAI L'UTENTE MEDIO-BASSO CUI E' RIVOLTO IL SITO.
Idee? Soluzioni? Mi devo accontentare?
Spero di aver spiegato bene quale sia il problema
-
La pagina bianca appare da quanto hai inserito l'ob_start() o anche da prima?
Perché ob_start() ti blocca gli output (che era il problema da te riscontrato giorni fa, che resta un mistero che sarebbe bene risolvere...). Con ob_end_flush() dovrebbe partire la stampa a video di tutto ciò che è stato bloccato. Prova a metterlo dopo i redirect.
Anche questo problema di chrome per me è nuovo, e anche "aiutandoti" con soluzioni che riguardano il tasto indietro del browser, resta una situazione anomala che sarebbe bene risolvere, più che aggirare in modo fantasioso.
-
Ciao Gigi991. Sinceramente è difficile dirlo, perché prima non funzionava per nulla il redirect, ad ogni modo con la tua dritta si è risolto tutto! Grazie mille!! Ora ne so una in più
-
Buongiorno a tutti, non so se qualcuno è ancora attivo in questa sezione, però io ci provo.
Il problema che non riesco a risolvere questa volta è il seguente:
Ho creato un piccola WebApp vorrei che gli utenti dovessero effettuare il login per accedere alla webapp, ma vorrei che il login fosse da effettuare una sola volta (anche ogni TOT, ma comunque non tutte le volte). Ho cercato con un disperato una soluzione sul Web, ma non riesco a risolvere il problema. E' una cosa possibile oppure no?
-
@Rapide said:
Buongiorno a tutti, non so se qualcuno è ancora attivo in questa sezione, però io ci provo.
Il problema che non riesco a risolvere questa volta è il seguente:
Ho creato un piccola WebApp vorrei che gli utenti dovessero effettuare il login per accedere alla webapp, ma vorrei che il login fosse da effettuare una sola volta (anche ogni TOT, ma comunque non tutte le volte). Ho cercato con un disperato una soluzione sul Web, ma non riesco a risolvere il problema. E' una cosa possibile oppure no?Se l'utente non è loggato, controlli la presenza di un cookie, creato al momento del login. Il cookie conterrà nome utente e password, una volta estratti i dati fai un check sul database, se c'è il riscontro logghi l'utente.
-
Ciao Supercapocc! Grazie mille per la risposta, ho provato a fare come suggerito e "ci siamo quasi"... Ho due piccoli dubbi ancora:
- A livello di sicurezza come siamo messi? Io per cercare di mantenere un livello "discreto" di sicurezza ho deciso di salvare la password nei cookie già criptata è sufficiente? (E' pur sempre vero che è un'applicazione per gestire le partite di calcetto, non contiene dati sensibili...);
- Mi funziona quasi tutto, tranne il riconoscimento dell'ID... Provo a postare alcuni estratti di codice, magari mi sfugge un errore banale...
pagina di LOGIN (è solo un estratto quindi è normale che manchi il tag di chiusura PHP
[PHP]<?php// Includo la connessione al databaseinclude 'connect.php';
//FUNZIONE DI VERIFICA SESSIONE-COOKIESif (isset($_COOKIE['session'])) {
header('Location: index.php');
exit; }
//FUNZIONE DI LOGIN
// Se il modulo viene inviato...
if(isset($_POST['login'])) {
// Dati Inviati dal modulo
$id = (isset($_POST['id'])) ? trim($_POST['id']) : '';
$user = (isset($_POST['user'])) ? trim($_POST['user']) : '';
$pass = (isset($_POST['pass'])) ? trim($_POST['pass']) : '';
// Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
if (!get_magic_quotes_gpc()) {
$id = addslashes($id);
$user = addslashes($user);
$pass = addslashes($pass);
}
// Crypto la password e la confronto con quella nel database
$pass = md5($pass);
// Controllo l'utente esiste
$query = mysql_query("SELECT id FROM utenti WHERE user = '$user' AND pass = '$pass' LIMIT 1");
// Se ha trovato un record
if(mysql_num_rows($query) == 1) {
// prelevo l'id dal database
$login = mysql_fetch_array($query);
// Creo una variabile di sessione
$_SESSION['login'] = $login['id'];
$_SESSION['user'] = $_POST['user']; $_SESSION['pass'] = md5($_POST['pass']);
setcookie('session', $_SESSION['user'] && $_SESSION['pass'], time()+3600);
// reindirizzo l'utente header('Location: index.php');
exit;
}
// se non esiste da l'errore
else {
echo '<script type="text/javascript">alert("nome utente o password errati!");</script>'; }
;}[/PHP]Pagina profilo.php (ovvero una delle pagine private);
[PHP]
<?php
// Includo la connessione al database
include 'connect.php';
//FUNZIONE DI VERIFICA SESSIONE-COOKIES
if (isset($_COOKIE['session'])) {
$idcookie = $_SESSION['login'];
$usercookie = $_SESSION['user'];
$passcookie = $_SESSION['pass'];
// Controllo se i cookies corrispondono ad un utente registrato
$query = mysql_query("SELECT id FROM utenti WHERE user = '$usercookie' AND pass = '$passcookie' LIMIT 1");
if(mysql_num_rows($query) == 1) {
// prelevo l'id dal database
$result = mysql_query($query);
while ($riga = mysql_fetch_array($result, MYSQL_ASSOC)) {
$idcookie = $riga['id'];
}
}
}
else {
header ('location: login.php');
exit;}
[/PHP]
-
#ERRATA CORRIGE
scusa, ma sono stato troppo affrettato nel rispondere... Ho avuto modo di fare un po' di test. Su Desktop (mac e win) pare funzionare correttamente, mentre su tutti i dispositivi mobile funziona finché non chiudo definitivamente il browser. Forse è normale, ma sono certo che esiste un modo per risolvere questo problema, perché uso altri siti/WebbApp che non presentano questo problema, salvo impostazioni locali (cookies disabilitati o navigazione in incognito)... Cosa sbaglio? Considera che, me ne sono accorto adesso, non trovi il "session_start()" perché è inserito nel file connect.php, potrebbe essere questo il problema o uno dei?
-
Buongiorno a tutti! Ultimo post poi passo e chiudo! Ho risolto ogni problema con un po' di intuito e qualche escamotage. Posto di seguito alcuni frammenti di codice che potrebbero tornare utili ai posteri:
codice (commentato) per il login
[PHP]<?php
// Includo la connessione al database
include 'connect.php';//FUNZIONE DI VERIFICA SESSIONE-COOKIES
if (isset($_COOKIE['session'])) {
header('Location: index.php');
exit; }//FUNZIONE DI LOGIN
// Se il modulo viene inviato...
if(isset($_POST['login'])) {
// Dati Inviati dal modulo
$id = (isset($_POST['id'])) ? trim($_POST['id']) : ''; // Metto nella variabile 'pass' il dato inviato dal modulo, se non viene inviato dò di default ''
$user = (isset($_POST['user'])) ? trim($_POST['user']) : ''; // Metto nella variabile 'user' il dato inviato dal modulo, se non viene inviato dò di default ''
$pass = (isset($_POST['pass'])) ? trim($_POST['pass']) : ''; // Metto nella variabile 'pass' il dato inviato dal modulo, se non viene inviato dò di default ''// Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
if (!get_magic_quotes_gpc()) {
$id = addslashes($id);
$user = addslashes($user);
$pass = addslashes($pass);
}// Crypto la password e la confronto con quella nel database
$pass = md5($pass);// Controllo l'utente esiste
$query = mysql_query("SELECT id FROM utenti WHERE user = '$user' AND pass = '$pass' LIMIT 1");
// Se ha trovato un record
if(mysql_num_rows($query) == 1) {
// prelevo l'id dal database
$login = mysql_fetch_array($query);
// Creo una variabile di sessione
$_SESSION['login'] = $login['id'];
setcookie('session', $_SESSION['login'], time()+606024*365);
// reindirizzo l'utente
header('Location: index.php');
exit;
}
// se non esiste da l'errore
else {
echo '<script type="text/javascript">alert("nome utente o password errati!");</script>';
};
}
?>[/PHP]codice (commentato) per l'autenticazione / by pass autenticazione utilizzando i cookies
[PHP]<?php
// SE L'UTENTE E' GIA' LOGGATO
// Includo la connessione al database
include 'connect.php';//FUNZIONE DI VERIFICA SESSIONE-COOKIES
if (isset($_COOKIE['session'])) {
$idcookie = $_COOKIE['session'];
// Controllo se i cookies corrispondono ad un utente registrato
$query = mysql_query("SELECT * FROM utenti WHERE id = '$idcookie' LIMIT 1");
if(mysql_num_rows($query) == 1) {
}
}
else {
header ('location: login.php');
exit;};
?>[/PHP]Fin qui tutto semplice e funzionante. Il problema sorge quanto da una pagina "privata" si vuole passare ad un'altra pagina privata senza un form e quindi un "post o get", ma con un semplice <a href ...>. Quello che occorre è:
-
dettagliare il link come segue (ovvero aggiungendo il target)
[HTML]<a class="privata" href="profilo.php" class="login" target="_top">PROFILO</a>[/HTML] -
Aggiungere nell'header di tutte le pagine "private" collegate fra di loro da semplici link <a href ...> il seguente script jquery
<!-- SCRIPT CHE PREVIENE APERTURA DI LINK IN BROWSER --> <script type="text/javascript"> $(document).ready(function(){ if (("standalone" in window.navigator) && window.navigator.standalone) { // For WebApps $('a').on('click', function(e){ e.preventDefault(); var new_location = $(this).attr('href'); if (new_location != undefined && new_location.substr(0, 1) != '#' && $(this).attr('data-method') == undefined){ window.location = new_location; } }); } }); </script>
-
-
Salve Rapide, non ho provato l'ultimo codice pubblicato ma ho dei dubbi su questa porzione di codice: @Rapide said:
codice (commentato) per l'autenticazione / by pass autenticazione utilizzando i cookies [PHP]if(mysql_num_rows($query) == 1) { }[/PHP] Infatti se il DB contenesse l'istanza non verrebbe fatto nulla per memorizzare l'avvenuta autenticazione e quindi l'utente non risulterà mai loggato.