Area riservata proprio sito

  • Creatore Discussione Creatore Discussione ntoflip
  • Data di inizio Data di inizio

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:
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:
 
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?
 
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:
 
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:
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:
il copia incolla mi ha trasformato alcuni apici vedi sotto, controlla anche da altre parti

if($_SESION['code']==”” or $_SESION['code']!= $code){
 
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.
 
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
 
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..
 
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 ||
 
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:
 
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!!
 
non capisco perchè a me funzia
prova a commentare in b.php
/*
if (!isset($_SESSION)){
session_start();
}
*/

riservata.jpg
 
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..
 
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"
 
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