Area riservata proprio sito

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
Premetto che ho cercato l'argomento svariate volte ma non sono riuscito a capire granchè.. sono agli inizi e sono stupido!

Allora.. Vorrei realizzare un'area riservata all'interno del mio sito personale (con la quale gestire l'inserimento di alcuni dati) utilizzando esclusivamente php e mysql. Ho letto su questo forum che c'è un modo per farlo con asp ma per adesso non ho nessuna intenzione di intraprendere lo studio di un altro linguaggio (almeno non prima d'aver capito php).

Da quanto poi credo di aver appreso qua e là è che si dovrebbero usare php e mysql soprattutto se si intende gestire l'area riservata per più utenti. e che il meccanismo principale sia quello di registrare inizialmente gli utenti attraverso un form che a sua volta registra i dati nel database, che infine verranno recuperati in fase di login..

vabbè.. nel mio caso (l'unico utente sono io) ho ritenuto opportuno saltare la fase di registrazione tramite form ed ho creato una tabella nel database con tre campi(colonne) e una sola riga.

Codice:
CREATE TABLE Users
(user_id INTEGER AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
pass VARCHAR(50)
)

e

Codice:
INSERT INTO Users (name, pass)
VALUES (ciccio, pasticcio)

Così per sperimentare ho creato un form che manda i dati inseriti al file login.php che li confronta con quelli della tabella Users e nel caso coincidano li mostra in output. Ovviamente nel caso avesse funzionato mi sarei ingegnato per ottenere un risultato diverso (come il reindirizzamento ad un'altra pagina) però..

Il file login.php è il seguente

Codice:
<?php
require_once('db_info.inc');
$connessione = @new mysqli($serv,$me,$mep,$datab);

if (mysqli_connect_errno() != 0)
{
$errno= mysqli_connect_errno();
$errmsg=mysqli_connect_error();
echo "Connessione non riuscita: <br/>($errno) $errmsg<br/>\n";
exit;

$connessione->query("SET NAMES 'utf8'");

//difesa SQL Injection fa l'escape dei dati inseriti nel form di provenienza
$nome=trim($_POST['nome']);
$nome=@connessione->real_escape_string($username);
$pswd=trim($_POST['pass']);
$pswd=@connessione->real_escape_string($pswd);

$q_str = "SELECT * FROM Users WHERE 'name'='$nome' AND 'pass'='$pswd'";
$result = $connessione->query($q_str);
if ($result === FALSE)
{
$errno= $connessione->errno;
$errmsg= $connessione->error;
echo "Connessione non riuscita: <br/>($errno) $errmsg<br/>\n";
$connessione->close();
exit;
}
else
{
$row= @$result->fetch_assoc();
echo <<<ROW
<p> riga 1: {$row['user_id']}</p>
<p> riga 2: {$row['name']}</p>
<p> riga 3: {$row['pass']}</p>
ROW;
}
$result->close();
}
$connessione->close();

?>

Probabilmente di errori ce n'è più d'uno ma io non riesco proprio a vederli.. Probabilmente è proprio il meccanismo che non ha proprio senso. Ma se qualcuno mi indicasse la via.. lo ringrazierei in eterno!!
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
premetto che non sono un esperto ma secondo me dovresti modificare

PHP:
$q_str = "SELECT * FROM Users WHERE 'name'='$nome' AND 'pass'='$pswd'";

in

PHP:
$q_str = "SELECT * FROM Users WHERE name='$nome' AND pass='$pswd'";

:hammer:
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
Si, in effetti, quelle virgolette non so da dove saltano fuori.. però continua a non funzionare.. ma secondo te, questo tipo di operazione per un'ar€a riservata potrebbe funzionare?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
come accennavo non sono un esperto, anche perchè sono rimasto all'utilizzo di operatori tipo = e non -> (non mi piaccono), tanto per renderti l'idea molto spesso non utilizzo il codice $a++, ma $a=$a+1,
comunque se vuoi ti faccio sapere come faccio io
:hammer:
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
Certo, mi piacerebbe molto sapere come fai tu..
Io uso gli operatori tipo -> perchè ho questo libro che li usa, e cerco di seguirlo il più possibile perchè avendolo sottomano è più facile da consultare invece di perdersi nel mare della rete.. A quanto pare il libro in questione usa la classe mysqli di php5 e forse per questo usa ->, oppure non c'entra niente.. anch'io non sono un esperto!!

Un'altra cosa che non ho capito dell'area riservata è che se pure riuscissi a sviluppare un metodo del genere, nulla mi vieta di scrivere nella barra degli indirizzi il collegamento diretto alla pagina riservata.. nel senso come si fa a dichiarare delle cartelle di un sito riservate alle quali si accede solo con autenticazione??
Grazie borgo.
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ecco come ho fatto io e come ho (cercato) risolto il problema


nulla mi vieta di scrivere nella barra degli indirizzi il collegamento diretto alla pagina riservata..

PHP:
<?php
if (!isset($_SESSION)){
	session_start();
 }
/*------------------------------------------------------------------------------------------------------------------
questa funzione pulisce tutto il testo sostituendo/eliminando TUTTI  i caretteri
 ASCI da 0 a 127 con spazi vuoti (o altro a scelta), con esclusione dei numeri
 e delle lettere minuscole e maiuscole
questa funzione funziana sia se magig quotes on o off
-------------------------------------------------------------------------------------------------------------------*/
function ripulisciA3($txt,$sost){// testo da verificare e carattere sostitutivo
$ritorna="";
	$txt=stripslashes($txt);// elimino il primo \ se doppi o \ prima di carattere
	$lungo=strlen($txt)-1;
	for($car=0; $car <= $lungo; $car++){//esplora la variabile $txt carattere per carattere
		for($k=0; $k <= 127 ; $k++){//esplola tutti i caratteri
			if($k >= 0 && $k <=47){// caratteri speciali da NULL a /
				$txt[$car]=str_replace(chr($k), $sost, $txt[$car]);
			}elseif($k >= 58 && $k <=64){//caratteri da : a @
				$txt[$car]=str_replace(chr($k), $sost, $txt[$car]);
			}elseif($k >= 91 && $k <=96){//caratteri da [ a '
				$txt[$car]=strtr($txt[$car], chr($k), $sost);
			}elseif($k >= 123 && $k <=127){//caratteri da { a DEL
				$txt[$car]=str_replace(chr($k), $sost, $txt[$car]);
			}// fine if esplora caratteri
		}//fine ciclo caratteri speciali
		$ritorna .=$txt[$car]; //ricostruisce il testo
	}//fine ciclo esplora testo
	return $ritorna; //riorna il testo ripulito o al massimo stringa vuota
}
// --------------------fine funzione---------------------------------------------------------------------

$code="aBc"; //codice arbitrario qualsiasi valore es. XyZ o 1234UUU…..

if($_SESION['code']=="" or $_SESION['code']!= $code){

/* -------------------------------------------------------------------------------------------------------------
nella pagina chiamante con il form in cui inserisco l’username e la password creo una sessione
di valore ad es.
$_SESSION['code']=”aBc”;
in questa pagina leggo la sessione e se qualcuno entra tramite indirizzo la sessione è vuota o comunque diversa dal valore assegnatole quindi esco immediatamente
forse sistono sistemi migliori ma questo è quello che mi è venuto in mente
----------------------------------------------------------------------------------------------------------------*/

echo "<meta http-equiv='Refresh' content='0; URL=pagina_chiamante.php'>";// o altra pagina

}else{//vuol dire che sono arrivato a questa dalla pagina inserimento user e pass

/*leggo l’user e la passovord che vengono dal form e le ripolisco*/

$user=  ripulisciA3($_POST['usn',"")//ripulisco l’username
$psw=  ripulisciA3($_POST['psw'],"")//ripulisco l’username
if($user =="" or $psw==""){//la pulizia mi ha restituito stringa vuota
//quindi esco 
echo "<meta http-equiv='Refresh' content='0; URL=pagina_chiamante.php'>";// o altra pagina
}else{//le stringhe non sono vuote e ripulite quindi ora verifico da db
$cerco=mysql_query("SELECT usn, psw FROM mia_tabella WHERE usn='".$usn."' AND psw='".$psw."'" );
$esiste=mysql_num_rows($cerco); //quanti record con le condizione where
if($esiste>0){//potre anche mettere $esiste=1
/*-------------------------------------------------------------
Tutto quello che devo fare
--------------------------------------------------------------*/
}else{//usn e/o psw non sono nel db
//esco
echo "<meta http-equiv='Refresh' content='0; URL=pagina_chiamante.php'>";// o altra pagina
}//fine else o usn o psw non corretti
}//fine else verifica usn e psw
}//fine else verifica session

penso che lo script sia commentato da capirsi, in caso sono qui
:hammer:
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
il copia incolla mi ha trasformato alcuni apici vedi sotto, controlla anche da altre parti

if($_SESION['code']==”” or $_SESION['code']!= $code){
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
wow, non sono per niente un esperto (anzi..) e quindi non ho capito proprio tutto.. il funzionamento di base si, ma la storia della sessione è un argomento che mi sfugge ancora e non mi è chiaro l'utilizzo del 'code'.
Probabilmente è proprio quella la chiave per concedere privilegi a una pagina riservata.. giusto? la pagina in questione dovrebbe controllare prima di caricarsi se si ha un id sessione valido, no?

un altro dubbio che ho sul tuo codice è la funzione ripulisci, cosa c'è che non va nella real_escape_string?

Comunque grazie alle tue indicazioni spero di riuscire a combinare qualcosa e nel caso ci riuscissi posterei la soluzione!!
grazie ancora.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
non c'è niente che no vada

cosa c'è che non va nella real_escape_string?

ma io voglio essere sicuro di avere solo ed esclusivamente caratteri da 0 a 9 da a a z e da A a Z

per la sessione, non è difficile

nella pagina dove hai il form

<?php
if (!isset($_SESSION)){
session_start();
}

//....eccetera

$_SESSION['code']="aBc";

//....eccetera
?>

nella pagina di arrvo, quella che ti ho postatto prima

viene cercata la sessione e se non c'è (cosa che avviene se chiami la pagina direttamente con suo url da riga di comando) o diversa da quello che hai indicato si viene rimandati al form o ad un'altra pagina con

echo "<meta http-equiv='Refresh' content='0; URL=pagina_chiamante.php'>"
:hammer:
p.s.
potresti trasmettere usn e psw tramite sessione invece che con post
'code? è un nome come un'altro
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
sto provando ad utilizzare il tuo script ma trovo un po' di difficoltà.. probabilmente perchè sbaglio qualcosa da qualche parte, così ho provato a semplificare tutto togliendo la convalida dell'input l'autenticazione tramite db e il reindirizzamento per provare esclusivamente l'accesso all'area riservata tramite il 'code' (o qualsivoglia parametro associato a $_SESSION)..

ho questa prima pagina in cui c'è il form d'accesso.. e in cui assegno il valore al 'code'.. giusto?

Codice:
<?php
session_start();
$_SESSION['code'] = "abc";

echo <<<PAGE
<html>
<head>
<title>Accesso Area Riservata</title>
</head>
<body>
<form>-------</form>
</body>
</html>
PAGE;
?>

poi ho questa seconda pagina che controlla se il code corrisponde oppure no..

Codice:
<?php
session_start();

$code="abc";

if ($_SESSION['code'] == $code)
{ 
echo "area riservata";
}
else
{
echo "torna indietro";
}

?>

ma se così fosse nulla mi impedirebbe di accedere alla prima pagina e ottenere così il code e in seguito digitare nella barra degli indirizzi l'url alla seconda avendo ottenuto il 'code'.
Sicuramente c'è qualcosa d'importante che mi sfugge nella comprensione del meccanismo generale ma non riesco a capire cosa..
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
intanto metti

if (!isset($_SESSION)){
session_start();
}
perchè se hai creato la sessione non ricrearla di nuovo

poi nella pagina di arrivo verifica non solo aBc ma anche che non sia vuota

if ($_SESSION['code'] != $code or $_SESSION['code']==""){
echo "torna indietro";
}else{
echo "sono passato";
}

dalla riga del browers scrivi

www.tuo_sito.it/pagina_di_arrivo.php/ o
http://localhost:8080/mia_cartella/pagina_di_arrivo.php
se stai lavorando in locale


cioè cerchi di arrivare alla pg logggata senza passare per il form
in questo caso dovrebbe apparire il messaggio: torna indietro

p.s.
basterebbe comunque verificare $_SESSION['code']==""
al posto di or puoi mettere ||
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
dimenticavo
tutto è possibile ma se dal bw cerchi di conoscere code utilizzando vedi html il php puro non lo vedi
cioè non vedi l'istruzione
$_SESSION['code']="pincopallo";
inoltre le sessioni al contrario dei cooki non risiedono sul computer dell'utente e quindi non accessibili (salo qualche espertissimo, del resto entrano anche nei server del pentagono)
:hammer:
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
Non mi funziona :confused:, ho provato a inserire ciò che mi hai suggerito.

allora prima pagina

Codice:
<?php

if (!isset($_SESSION)){
session_start();
} 

$_SESSION['code'] = "abc";

echo <<<PAGE
<html>
<head>
<title>Accesso Area Riservata</title>
</head>
<body>

<p><a href="b.php">entra</a><p>
</body>
</html>
PAGE;
?>

e seconda pagina

Codice:
<?php
if (!isset($_SESSION)){
session_start();
} 

$code="abc";

if ($_SESSION['code'] != $code or $_SESSION['code']==""){
echo "torna indietro";
}
else
{
echo "sono passato";
}

?>

le ho caricate su un server di prova (non locale: 07x.net) e carico la prima pagina e senza cliccare sul link carico la seconda con la barra indirizzo e mi dice che sono passato!!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
non capisco perchè a me funzia
prova a commentare in b.php
/*
if (!isset($_SESSION)){
session_start();
}
*/

riservata.jpg
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
Con

Codice:
/*
if (!isset($_SESSION)){
session_start();
} 
*/

se inserisco l'indirizzo nella barra mi dice torna indietro ma anche se clicco sul link della pagina a.. boh, si impazzisce con php :hammer:!

per adesso sono riuscito a fare una singola pagina riservata tramite controllo su database, ma se volessi fare più pagine sicuramente serve la sessione e qualcosa come $_SESSION['code'], che probabilmente deve essere assegnato solamente una volta entrati nella singola pagina riservata e non già dal form perchè sennò non funziona..
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
guarda, questsono le pag che ho fatto

pagina chiante a.php

PHP:
<?php

if (!isset($_SESSION)){
session_start();
} 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>

<body>
<?php



$_SESSION['code'] = "abc";

echo "PAGE di accesso";

?>
<p><a href="b.php">entra</a><p>

</body>
</html>

e la ricevente b.php

PHP:
<?php

if(!isset($_SESSION)){
	session_start();
}

?>
<?php 
$code="abc";

if ($_SESSION['code'] != $code or $_SESSION['code']==""){
echo "torna indietro";
}
else
{
echo "sono passato";
}

?>

e provandola funziona, un piccolo appunto

se chiami a.php e poi chiami b.php da riga di comado (non dal link della pagina) la pagina b. da "sono passato" in quanto passando per a.php hai creato comunque la sessione
se invece esci dal bw e, riaperto il bw, chiami direttamente b.php (senza passare da a) da riga di comando ti da "torna indietro", le sessioni "vivono" sino a che non esci
come detto non è un sistema perfetto comunque porta un po' di difficoltà a chi vuole entrare di "straforo"
 

ntoflip

Utente Attivo
26 Ago 2008
50
0
0
si.. adesso ho fatto un po' di prove ed ho capito + o meno il funzionamento, ritornando al punto in cui siamo partiti, cioè al tuo primo esempio, se si assegna

Codice:
$_SESSION['code']="abc";

solo dopo

Codice:
$esiste=mysql_num_rows($cerco); 
if($esiste>0)

allora si accede alla seconda solo se ci si è autenticati almeno una volta nello stesso computer...

adesso ci vorrebbe solo un metodo per farlo scadere senza che si debba chiudere il browser..
 
Discussioni simili
Autore Titolo Forum Risposte Data
gandalf1959 [PHP] Verifica password per accesso ad area riservata PHP 3
M [WordPress] [HTML] AREA RISERVATA CON PROFILAZIONE WordPress 2
F [PHP] Creare un'area web riservata PHP 13
W Area riservata sicura PHP MySQL PHP 12
I Area riservata in PHP PHP 2
I [PHP] CURL per accesso ad area riservata PHP 6
W. YouneS Area riservata con php e mysql PHP 0
W [ASP] Password Login per area riservata Classic ASP 13
Recover Area riservata con database PHP 11
gandalf1959 problema con header in area riservata PHP 4
A area riservata in php senza data base PHP 19
Recover db in sola lettura su area riservata WordPress 1
L Accesso area riservata tramite QR code WordPress 3
A accesso area riservata nn funziona più PHP 1
A Area riservata con login e mysql ma nn mi logga PHP 1
E consigli per piccola area riservata PHP 4
Elisacau Area riservata.. WordPress 2
I Area riservata con contenuto personalizzato per i registrati? CMS (Content Management System) 0
B Area Riservata/Download per Wordpress WordPress 3
M Problema con form per accesso area riservata ai soci PHP 2
A problema con area riservata PHP 6
N Primo accesso area riservata PHP 1
neo996sps PHP + MYSQL: Errore su accesso area riservata PHP 1
P Area riservata con frontpage PHP 10
S Area riservata PHP PHP 3
F Area Riservata PHP+MySql - Chi mi corregge il codice??? PHP 18
S area riservata con mysql PHP 29
S Area riservata con login e mysql PHP 20
J Creare file html da un form in area riservata PHP 9
G Problema area riservata con IE PHP 6
B Aumentare livello di sicurezza accesso client area riservata Classic ASP 5
M Come creare un area riservata PHP 4
N impedire accesso area riservata a utenti registrati Database 3
D Creare Area RiservaTA PHP 8
A Area Riservata Manager - HELP !! PHP 2
R HTTP_REFERER e area riservata.. PHP 1
R Problema con area riservata... PHP 4
X Area Riservata Mysql+php PHP 13
SolidSnake4 area riservata PHP 20
borgo italia Accesso area riservata PHP 6
A area riservata asp Classic ASP 20
B creare un'area riservata PHP 1
S Area Riservata Classic ASP 6
W Help - area riservata Classic ASP 3
G area riservata con phpbb3 phpBB 1
I accesso area riservata multilivello PHP 1
W come si crea un area riservata HTML e CSS 5
D A ciascuno la prorioa area riservata PHP 0
K Area riservata - Limitazione tentativi inserimento PHP 0
K logout area riservata Classic ASP 1

Discussioni simili