php dal lato server (studio)

Per questioni di aumentare la sicurezza nella gestione dei dati, vi sono programmatori che si pongono il problema di come “NON ESPLICITARE i percorsi di pagine riservate”.

Seguiamo la discussione seguente:

https://forum.mrw.it/threads/impedire-laccesso-a-una-pagina-dalla-barra-degli-indirizzi.21897/

DOMANDA N1:

Ciao, vorrei sapere se esiste un modo per impedire a chi inserisce l’indirizzo di una pagina nella barra degli indirizzi di visualizzare la pagina stessa. Mi spiego meglio: ho una pagina protetta a cui si può accedere tramite password, soltanto che se si digita l’indirizzo di questa pagina protetta nella barra degli indirizzi la pagina si apre tranquillamente. Ecco io vorrei che questo non fosse possibile, per esempio reindirizzando l’utente che apre la pagina dalla barra degli indirizzi alla pagina di login dove inserire user e password. C’è qualcuno che può aiutarmi?

§§§

Reimposto la domanda:

supponiamo che il link1 protetto da pw1 ..

(in wordpress è possibile aprire una pagina con password tra le opzioni di creazione di una “nuova pagina”=statistiche)

sia la situazione la seguente:

******************************

PROCEDURA SEMPLIFICATA (ON)

******************************

link1=https// …/statistiche/

per potere accedere alla pagina “statistiche” devo prima digitare la pw1 creata al momento di creazione della pagina “statistiche”.

Metterò nella pagina “statistiche” un link2 che invia ad una pagina “pagina1” e cioé realizza:

link2=https// …/statistiche/pagina1/

Se il riconoscimento avviene con index.html + process.php

appena l’utente

(in ipotesi di avere violato pw1)
(oppure di avere la pw1)

sia giunto a “pagina1” .. -allora- si apre in automatico index.html per chiedere ..

l’input di scrivi “utente autorizzato”=pw2 (con un form1.html) ..

ed i dati “utente autorizzato” sono passati a “process1.php“.

DOMANDA:

cosa deve fare “process1.php“?

1) consentire –per esempio– l’accesso (ad utente “autorizzato” tramite pw2) ad un data base per votare riempiendo “form2.html“, che passerà i dati ad un process2.php.

oppure:

2) mandare un messaggio del tipo “utente NON autorizzato, ripetere il login”.

******************************

PROCEDURA SEMPLIFICATA (OFF)

******************************

NOTE CRITICHE ON

Si noti che la comparazione tra chi è autorizzato e chi non lo è ..

(si può eseguire su una sola pw2),

oppure aprire “form3.html” + process3.php

dove form3.html consente NOME, COGNOME, pw2, e verificare collegandosi ad un data base se la tripla (NOME, COGNOME, pw2) esiste nel data base.

Ma come aveva avuto “utente autorizzato” la pw2?

Nella nostra simulazione (semplificata) ipotizzeremo che sia già avvenuta la “PROCEDURA DI ISCRIZIONE” per esempio per consentire “il voto online”.

Ma la procedura di iscrizione è molto importante al fine di non autorizzare con una singola password ciascun utente autorizzato.

Infatti un utente autorizzato potrebbe cedere ad altri non iscritti e non aventi diritto a votare con la pw2 che fosse singola!

Più sicuro è autorizzare con la tripla (NOME, COGNOME, PW-i)

Dove PW-i è assegnata dal responsabile della procedura di voto (nel nostro esempio) al singolo utente, dopo che l’utente abbiamo completato la richiesta di iscrizione.

Ma nella nostra simulazione semplificata useremo una sola pw2.

NOTE CRITICHE OFF

vediamo la risposta di “borgo” sul link già citato:

++
cit on
++

borgo italia
Super Moderatore
Membro dello Staff
SUPER MOD
MOD

4 Feb 2008

www.borgo-italia.it

27 Gen 2010

#2

ciao
io faccio così, anche se forse esistono sistemi migliori.
1. nella pagina di partenza creo una sessione con una parola strana
es. $_SESSION[‘autorizzato’]=”birillo”;

2. nella pagina prima pagina riservata (prima di qualsiasi output html) verifico che la sessione esista e che questa sia uguale a “birillo”, se non esiste, o diversa, con header location rimando alla pag di log. questo mi fa accedere alla pagina solo se passo attraverso la pagina di creazione della sessione

++
cit off
++

esplorazione della modalità $_SESSION[‘autorizzato’]=”birillo”?

link1:

https://www.php.net/manual/en/reserved.variables.session.php

link2:

https://www.php.net/manual/en/function.session-start.php

cito (dal link1):

Un array associativo contenente variabili di sessione disponibili per lo script corrente. Consultare la documentazione sulle funzioni di sessione per maggiori informazioni su come viene utilizzato.

cito (dal link2):

session_start() crea una sessione o riprende quella corrente in base a un identificativo di sessione passato tramite una richiesta GET o POST, oppure passato tramite un cookie.

(6viola.it):

vedi specificatamente (ripetiamo):

https://www.php.net/manual/en/reserved.variables.session.php

quindi ..

si può gestire la “invisibilità” grazie alla istruzione $_SESSION[]

IN PARTICOLARE .. SI ESEGUA LA SEGUENTE SPERIMENTAZIONE:

grazie alla fonte:

https://www.w3schools.com/php/php_sessions.asp

example(1)

++
cit on
++
<?php
// Start the session
session_start();
?>

<!DOCTYPE html>
<html>
<body>
<?php
// Set session variables
$_SESSION[“favcolor”] = “green”;
$_SESSION[“favanimal”] = “cat”;
echo “Session variables are set.”;
?>

</body>
</html>

++
cit off
++

modifico come segue:

buffer3.php: (1)
fissa le variabili e gli argomenti di una sessione, subito dopo la creazione

++
cit on
++
<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// Set session variables
$value1 = “green”;
$value2 = “cat”;
$argoment1 = “favcolor”;
$argoment2 = “favanimal”;
$_SESSION[$argoment1]=$value1;
$_SESSION[$argoment2]=$value2;
echo”value1 = $value1″;
echo”<br> valeu2 = $value2″;
echo”<br> argoment1 = $argoment1″;
echo”<br> argoment2 = $argoment2″;
?>
</body>
</html>
++
cit off
++

buffer3 ha funzionato sia in locale che on line:

Nota Bene:
Attenzione agli spazi nella gestione di echo (nella citazione precedente) echo non ha spazi nello scrivere -ad esempio- echo”<br> argoment1=$argomente1″;

Note: The session_start() function must be the very first thing in your document. Before any HTML tags.

Get PHP Session Variable Values

Next, we create another page called “demo_session2.php”. From this page, we will access the session information we set on the first page (“demo_session1.php”).

Notice that session variables are not passed individually to each new page, instead they are retrieved from the session we open at the beginning of each page (session_start()).

Also notice that all session variable values are stored in the global $_SESSION variable:

traduzione:

Ottieni i valori delle variabili di sessione PHP
Successivamente, creiamo un’altra pagina chiamata “demo_session2.php”. Da questa pagina, accederemo alle informazioni di sessione che abbiamo impostato sulla prima pagina (“demo_session1.php”).

Nota che le variabili di sessione non vengono passate individualmente a ogni nuova pagina, ma vengono recuperate dalla sessione che apriamo all’inizio di ogni pagina (session_start()).

Nota inoltre che tutti i valori delle variabili di sessione sono memorizzati nella variabile globale $_SESSION:

buffer4.php: (2)
recupera -con nuovo link-
le variabili e gli argomenti di una sessione precedente

<?php
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<?php
// Echo session variables that were set on previous page
echo “Favorite color is “ . $_SESSION[“favcolor”] . “.<br>”;
echo “Favorite animal is “ . $_SESSION[“favanimal”] . “.”;
?>

</body>
</html>

la simulazione locale ha dato:

Favorite color is .
Favorite animal is .

ma se si aggiunge il nuovo link senza avere chiuso la sessione precedente restituisce:

Favorite color is green.
Favorite animal is cat.

commento:

quindi ha trasmesso alla nuova sessione (con il nuovo link) i parametri della sessione precedente!

dobbiamo svolgere il 3 esempio del link seguente:

https://www.w3schools.com/php/php_sessions.asp

e cioé:

estraggo.php (3)

stampa le sessioni precedenti

++
cit on
++

<?php
session_start();
?>

<!DOCTYPE html>
<html>
<body><?php
print_r($_SESSION);
?>
</body>
</html>

++
cit off
++

la risposta in locale è la seguente:

Array ( [favcolor] => green [favanimal] => cat )

commento (6viols.it):

Ci sta dicendo quello che avevamo estratto anche con

process3.php

e cioé

value1 = green
valeu2 = cat
argoment1 = favcolor
argoment2 = favanimal

Quindi ora simuliamo la modifica di una sessione:

buffer5.php (da utilizzare dopo buffer4.php)

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body><?php
// to change a session variable, just overwrite it
$_SESSION[“favcolor”] = “yellow”;
print_r($_SESSION);
?></body>
</html>

 

risposta:

Array ( [favcolor] => yellow [favanimal] => cat )

Destroy a PHP Session

https://www.w3schools.com/php/php_sessions.asp

distruggo.php:

<?php
session_start();

?>
<html>
<body>
<?php
session_unset();
sessione_destroy();
echo “All session var and session is destroyed”
?>
</body>
<html>

§§§

parte seconda:
il codice per log e pw secondo il forum:

Seguiamo la discussione seguente:

https://forum.mrw.it/threads/impedire-laccesso-a-una-pagina-dalla-barra-degli-indirizzi.21897/

ultima risposta del forum e cioé al link:

https://forum.mrw.it/threads/impedire-laccesso-a-una-pagina-dalla-barra-degli-indirizzi.21897/page-2

++
cit on
++

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
ciao
non riesco a capire dove sbagli. ho fatto le seguenti pagine e le ho provate e funziano. prova ad userle cosi come sono e verifica con le tue

pagina di login

PHP:
<?php
//questa è la pagina login.php
$pass_l=array(); 
$usrn_l=array(); 
$pass_l['pinco']="123"; 
$usrn_l['pinco']="piripacchio"; 
$pass_l['pallino']="777"; 
$usrn_l['pallino']="abracadabra";

if(isset($_POST['Submit'])){
	$pass = (isset($_POST['pass'])) ? $_POST['pass'] : ''; 
	$user = (isset($_POST['user'])) ? $_POST['user'] : '';
	if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){ 
		echo "<a href=\"bacheca.php\">entra</a>"; 
	}else{ 
		echo 'Login fallito, ricontrolla username e password inseriti... <meta http-equiv="refresh" content="3;url=login.php">'; 
	} 
}//fine if post
?>

++
cit off
++

++
cit on
++

pagina bacheca

PHP:
<?php
//questa è la pagina bacheca.php
if(basename($_SERVER['HTTP_REFERER']) != 'login.php'){
	header('Location: login.php'); 
}
echo "sono entrato da ".basename($_SERVER['HTTP_REFERER'])."e faccio quello che devo fare";
?>

++
cit off
++

forum:

cioè
se inserisco user e pass giusti mi da entra e da entra accedo a bacheca e a monitor ho sono entrato da login.php e faccio quello che devo fare

se inserisco user o pass errati mi da Login fallito, ricontrolla username e password inseriti…

se entro in bacheca in qualsiasi altro modo senza vedere nulla torno a login.php

Rikardinho90

Utente Attivo
ok riprovo, io comunque ho la pagina accedi dove c’è solo il form, poi ho il file login.php che riceve user e pass inseriti e si occupa di controllare se sono corretti ed eseguire i vari redirect (che ho trasformato in link visto che i redirect in questo caso non funzionano) e infine ho la pagina protetta bacheca.php . Adesso riprovo tutto e vedo se funziona

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
ciao
è lo stesso, io ho messo insieme form+log per fare primase le hai divise, nella pagina del form al posto di<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”post”>
…………
metti<form action=”login.php” method=”post”>
………………..tutto qui

Commento di 6viola.it:

realizzo borgo-login-loc.php:

++
cit on
++

<?php
//questa è la pagina login.php
$pass_l=array(); 
$usrn_l=array(); 
$pass_l[‘pinco’]=”123″; 
$usrn_l[‘pinco’]=”piripacchio”; 
$pass_l[‘pallino’]=”777″; 
$usrn_l[‘pallino’]=”abracadabra”;
if(isset($_POST[‘Submit’])){
$pass = (isset($_POST[‘pass’])) ? $_POST[‘pass’] : ”; 
$user = (isset($_POST[‘user’])) ? $_POST[‘user’] : ”;
if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){
echo “ok1”;
}else{
echo ‘Login fallito, ricontrolla username e password inseriti… ‘;
}
}//fine if post
?>

++
cit off
++

Commento 6viola.it:

Ho chiamato borgo-login-loc.php

quello che sul forum era “pagina login”

modifica1 (nel confronto forum e mia simulazione):

al posto di ..

if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){
echo "<a href=\"bacheca.php\">entra</a>";
}else{
echo 'Login fallito, ricontrolla username e password inseriti... <meta http-equiv="refresh" content="3;url=login.php">';
}
}//fine if post
?>

commento 6viola.it:

ho scritto:

if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){
echo “ok1”;
}else{
echo ‘Login fallito, ricontrolla username e password inseriti… ‘;
}
}//fine if post
?>

Nota Bene:
devo partire però dal form per acquisire i dati di login
che saranno poi passati a borgo-login-loc.php

vediamo il codice

borgo-form-loc.html:

++
cit on
++

<html>
<body>
<form action=”borgo-login-loc.php” method=”post”>
<p>
username
<input name=”user” type=”text”>
<br>
password
<input name=”pass” type=”text”>
<br>
</p>
<p>
<input type=”submit” name=”Submit” value=”Invia“>
</p>
</form>
</body>
</html>
++
cit off
++

La simulazione in locale è stata esattamente quella del forum e funziona come si vede nella foto precedente.

ripeto il file:

borgo-login-loc.php:

<?php
//questa è la pagina login.php
$pass_l=array();
$usrn_l=array();
$pass_l[‘pinco’]=”123″;
$usrn_l[‘pinco’]=”piripacchio”;
$pass_l[‘pallino’]=”777″;
$usrn_l[‘pallino’]=”abracadabra”;
if(isset($_POST[‘Submit’])){
$pass = (isset($_POST[‘pass’])) ? $_POST[‘pass’] : ”;
$user = (isset($_POST[‘user’])) ? $_POST[‘user’] : ”;
if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){
echo “ok1”;
}else{
echo ‘Login fallito, ricontrolla username e password inseriti… ‘;
}
}//fine if post
?>


immetto

user name = piripacchio

pw = 123

risposta?

ok1

immetto

user name = bertoldo

pw =123

risposta?

nella pagina:
http://localhost/borgo-login-loc.php

stampa:
Login fallito, ricontrolla username e password inseriti…

ritorno alla pagina precedente:
http://localhost/borgo-form-loc.html

posso provare un nuovo login

cvd.

Si noti l’uso degli array e le parentesi quadre per simulare la consultazione di un data base.

Si noti l’uso di “Submit” per fare un if molteplice ..

che testa

  • sia “un invio di dati tramite il form”

Si noti l’uso di  isset applicato a ..
sytax $pass = (isset($_POST[‘pass’])) ? $_POST[‘pass’] : ”;
https://stackoverflow.com/questions/13045279/if-isset-post

quindi fa un test sul passaggio dei parametri.

inoltre

  • sull’uso del “?”
  • sull’uso “:”

c’è da dire ..

operatori logici:
https://www.w3schools.com/php/php_operators.asp

PHP Conditional Assignment Operators:

?: Ternary $x = expr1 ? expr2 : expr3 Returns the value of $x.
The value of $x is expr2 if expr1 = TRUE.
The value of $x is expr3 if expr1 = FALSE

<!DOCTYPE html>
<html>
<body>

<?php
// if empty($user) = TRUE, set $status = “anonymous”
echo $status = (empty($user)) ? “anonymous” : “logged in”;
echo(“<br>”);

$user = “John Doe”;
// if empty($user) = FALSE, set $status = “logged in”
echo $status = (empty($user)) ? “anonymous” : “logged in”;
?>

</body>
</html>

commento (6viola.it) al test qui sopra:

la variabile $x=$user

con if si testa, sulla LOGica, LOG, se è vero che (“$user è vuoto”) = TH

LOG (espressione_1) = LOG (empty($user)) = è vero che $user non inizializzato?
?
LOG (espressione_2) = “anonymous”
:


Poiché la variabile $user non è stata inizializzata

(empty($user))=TRUE(espressione1)= if “è vero che $user non è inizializzato”

allora (:) si pone che “$x=TH=esperessione_2”

nel caso opposto si pone che “$x=espressione_1”

Nel caso in cui

la espressione sia:

$pass = (isset($_POST['pass'])) ? $_POST['pass'] : '';

tenendo conto che:

https://www.w3schools.com/php/func_var_isset.asp

isset controlla se è avvenuto il passaggio dei parametri in $_POST, in particolare con il passaggio del valore di ‘pass’

allora se l’esito di isset è positivo (cioé è avvenuta la trasmissione della password)

“$pass=espressione_2=$_POST[‘pass’]”

nel caso opposto “login fallito”.

Inoltre la posizione

“$pass=espressione_2=$_POST[‘pass’]”

nella scrittura di Borgo .. non è immediata!

Ma abilita “ulteriore controllo”:

if (in_array($pass, $pass_l) && in_array($user, $usrn_l)){
echo “ok1”;
}else{
echo ‘Login fallito, ricontrolla username e password inseriti… ‘;

Esaminiamo anche “ulteriore controllo” ..

https://www.php.net/manual/en/function.in-array.php

<?php
$os = array(“Mac”, “NT”, “Irix”, “Linux”);
if (in_array(“Irix”, $os)) {
echo “Got Irix”;
}
if (in_array(“mac”, $os)) {
echo “Got mac”;
}
?>

la risposta simulata in locale:

scrive:

Got Irix

Quindi “in_array” con la lista dei valori dell’array (della matrice) è un metodo per cercare tra un valore noto (Irix) ed una matrice (in questo caso un vettore) di elementi della matrice.

E’ come se chiedessi tra i sistemi operativi elencati .. esiste il sistema Iris?

Se esiste scrivi (echo) Got Irix

Nel caso di Borgo:

if (in_array($pass, $pass_l) && in_array($user, $usrn_l))

viene introdotta una matrice della pass, detta $pass_l, cioé LIST
Poiché $pass è confrontata con $pass_l (che ha più di una sola pass)

un if sulla sola condizione:

if (in_array($pass, $pass_l)

restituirebbe TRUE oppure False.

Poiché in_arrey () crea un confronto tra $pass e tutte le pass_l contenute in una matrice.

A cui restituisce all’if una condizione LOGICA (True/False)

la “&&” indica la condizione di AND logico, ossia deve esistere la presenza sia della stringa user e anche della stringa password nel confronto tra le variabili inserite nel form e il data base creato con un array (o più array), oppure -più in generale- con un data base.

ultimo aggiornamento:
4 agosto 2024, ore 12.10

Questa voce è stata pubblicata in informatica. Contrassegna il permalink.