DOMANDA [PHP] Chi mi aiuta ??

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Ok, dimmi cosa ti serve sapere ?

- - - Updated - - -

Ho dato uno sguardo al codice, ed è vulnerabile ad attacco sql injection .
In parte il database è sbagliato non è in 1° forma normale.
 
Ok, dimmi cosa ti serve sapere ?

- - - Updated - - -

Ho dato uno sguardo al codice, ed è vulnerabile ad attacco sql injection .
In parte il database è sbagliato non è in 1° forma normale.
Lo so che è vulnerabile.. deve essere un progetto per fine anno, da presentare a una commissione..

Tecnicamente mi servono script corretti e controllo degli accessi delle singole pagine in modo da non potervi accedere se non autenticati
 
Login.php va modificato come segue.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Area Riservata | Autenticati</title>

<link rel="stylesheet" href="css/style2.css">

</head>


<body>


<?php
session_start();


function Open($dbname) {


$con = new mysqli("127.0.0.1","root","",$dbname);


if ($con->connect_errno) {
echo "<h2>".$con->connect_error."</h2>";
exit();
}
else

return $con;
}


function Query($con,$sql) {
$res = $con->query($sql);
if (!$res)
echo "<h2>".$con->error."</h2>";
return $res;
}


function Close($con) {
$con->close();
}


if ($_SERVER['REQUEST_METHOD'] == 'POST')
{

$username = $_POST['username'];
$password = $_POST['password'];


$mysql = Open("catdb");
$sql = "SELECT ID_Tecnico, Nome, Cognome
FROM tecnico
WHERE Username= '$username' && Password='$password'";
$rs = Query($mysql, $sql);

if ($rs->num_rows == 1) {
$obj = $rs->fetch_object();
$_SESSION['id_tecnico'] = $obj->Id_Tecnico;
$_SESSION['nome'] = $obj->Nome;
$_SESSION['cognome'] = $obj->Cognome;
$_SESSION['login'] = "autorizzato"; // SE HA TROVATO ALMENO 1 RECORD, SALVO QUESTA SESSIONE IN LOGIN E ME LA PORTO DIETRO IN OGNI PAGINA.

header("Location: areariservata.php");
}
else {
echo "<div class='container'>


<div class='login'>


<h1 class='login-heading'>


<strong>Dati errati!</strong> Torna indietro.</h1>


<button class='btn btn--right' onclick='history.back()'> Indietro </button>


</div>
</div>";
}
Close($mysql);

} else


echo "


<div class='container'>


<div class='login'>


<h1 class='login-heading'>


<strong>Benvenuto.</strong> Autenticati.</h1>


<form method='post' action='" . $_SERVER['PHP_SELF'] ."'>


<input type='text' name='username' placeholder='Username' required='required' class='input-txt' />


<input type='password' name='password' placeholder='Password' required='required' class='input-txt' />

<button type='submit' class='btn btn--right'>Entra</button>

</div>
</form>


</div>
</div>";


?>


</body>
</html>

In ogni pagina, dopo la funzione nativa SESSION_START(); di php per controllare se l'utente hja effettuato il login, dovrai scrivere questo :
<?php
session_start();
if(isset($_SESSION['login']) == "autorizzato")
{
// UTENTE LOGGATO, MOSTRO IL RESTO DELLO SCRIPT

}
else
{
// UTENTE CHE CERCA DI ACCEDERE SENZA AVER FATTO IL LOGIN, REDIRECT A PAGINA INDIETRO.... O MESSAGGIO DI ERRORE CON EXIT;
}
?>

Se vuoi spiegazioni chiedi pure.
 
Ultima modifica:
Login.php va modificato come segue.



In ogni pagina, dopo la funzione nativa SESSION_START(); di php per controllare se l'utente hja effettuato il login, dovrai scrivere questo :


Se vuoi spiegazioni chiedi pure.
Ok, editato il login.php.. per quanto riguardo l'inserimento (input.php), so che è sbagliato fatto in quel modo ma inserire li inserisce i dati

Ho inserito il controllo accessi, ma c'è qualcosa che non mi convince nel codice, infatti il controllo non funziona!

PHP:
 input.php - Pastebin.com[/url]
 
Ultima modifica:
Devi scrivere così nello script inserimento_dati.php dopo session_start();
Ho messo la condizione negata " ! " quindi se login NON è autorizzato stampa errore ed esci!
L'else non c'è bisogno, in quanto se è autorizzato, salta la condizione dell' IF ed esegue il codice successivo.
if(!isset($_SESSION['login']) == "autorizzato")
{
Print "Accesso non consentito";
Exit();
}
 
Devi scrivere così nello script inserimento_dati.php dopo session_start();
Ho messo la condizione negata " ! " quindi se login NON è autorizzato stampa errore ed esci!
L'else non c'è bisogno, in quanto se è autorizzato, salta la condizione dell' IF ed esegue il codice successivo.
Fatto e funziona, quando sta autenticato carica la pagina, quando non lo è, tipo quando chiudo il browser da l'errore.

Bene, per quanto riguarda gli altri 2 script?

Per il cerca, vorrei fare che stampasse tutte le riparazioni inerenti al cognome, o al massimo inserisco un campo di ricerca per il codice fiscale oppure utilizzo la chiave primaria dell'id cliente per la ricerca. Ora come ora, stampa tutto quello che inserisco nel form, se un campo non corrisponde non trova il cliente.

L'attuale ricerca, cerca il cliente e non la riparazione.

Per quanto riguarda l'inserimento dei dati, da un errore php, ma vengono inseriti, inoltre, se si riavvia la pagina, questi dati vengono inseriti infinite volte.. devo mettere che una volta inserito si chiuda la connessione e torni ad una pagina specifica mediante l'header location.
 
Lo so che è vulnerabile.. deve essere un progetto per fine anno, da presentare a una commissione..

Tecnicamente mi servono script corretti e controllo degli accessi delle singole pagine in modo da non potervi accedere se non autenticati


Spero che nessuno di quella commissione vada a vedere il codice, perchè a leggerlo sanguinano gli occhi da quanto è disordinato..
senza offesa è.. :birra:

Ad esempio scrivere su ogni file i dati di accesso del database, oltre a eventuali problemi di sicurezza (non bisogna assolutamente usare l'utente root del database!!!), rende difficoltosa la manutenzione del tutto.

Per la connessione al database e le query, con php, bisognerebbe utilizzare i PDO, ti faccio un esempio di codice un po scritto meglio per gestire il database:

Ti crei un bel file database.php dove inserire le credenziali e la connessione:
PHP:
<?php
class Database {
 private  $dbName = 'NOMEDATABASE';
 private  $dbHost = 'localhost';
 private  $dbUsername = 'USERNAME';
 private  $dbUserPassword = 'PASSWORD';

 public function connect()    {
  return new PDO( "mysql:host=".$this->dbHost.";"."dbname=".$this->dbName, $this->dbUsername, $this->dbUserPassword);
 }
}
?>

Poi quando hai bisogno di fare una query:
PHP:
<?php
include_once 'database.php';

$db = new Database(); // Crei una istanza della classe database

$db = $db->connect(); // ti connetti al tatabase

// esegui la queri al database
$sql = "SELECT * FROM tabella";
$stmt = $db->prepare($sql);
$stmt->execute();

// salvi i risultati in una variabile
$risultati = $stmt->fetchAll();

?>

Come vedi per richiamare la connessione bastano 2 righe di codice.
Poi in caso dovessi cambiare le credenziali d'accesso al database (il nome del database, il tipo di database, ecc..), basta modificare un file invece che 100.


Fatto e funziona, quando sta autenticato carica la pagina, quando non lo è, tipo quando chiudo il browser da l'errore.

Bene, per quanto riguarda gli altri 2 script?

Per il cerca, vorrei fare che stampasse tutte le riparazioni inerenti al cognome, o al massimo inserisco un campo di ricerca per il codice fiscale oppure utilizzo la chiave primaria dell'id cliente per la ricerca. Ora come ora, stampa tutto quello che inserisco nel form, se un campo non corrisponde non trova il cliente.

L'attuale ricerca, cerca il cliente e non la riparazione.

Per quanto riguarda l'inserimento dei dati, da un errore php, ma vengono inseriti, inoltre, se si riavvia la pagina, questi dati vengono inseriti infinite volte.. devo mettere che una volta inserito si chiuda la connessione e torni ad una pagina specifica mediante l'header location.


Per quanto riguarda la ricerca nel database, non è necessario (anzi è un errore) che l'utente debba inserire tutti quei dati.
L'utente dovrebbe inserire solamente il nome del cliente e recuperare gli interventi associati.
Per fare ciò devi fare una JOIN (nella query sql) tra la tabella dei clienti e la tabella degli interventi. Qui puoi trovare degli esempi.
 
Spero che nessuno di quella commissione vada a vedere il codice, perchè a leggerlo sanguinano gli occhi da quanto è disordinato..
senza offesa è.. :birra:

Ad esempio scrivere su ogni file i dati di accesso del database, oltre a eventuali problemi di sicurezza (non bisogna assolutamente usare l'utente root del database!!!), rende difficoltosa la manutenzione del tutto.

Per la connessione al database e le query, con php, bisognerebbe utilizzare i PDO, ti faccio un esempio di codice un po scritto meglio per gestire il database:

Ti crei un bel file database.php dove inserire le credenziali e la connessione:
PHP:
<?php
class Database {
 private  $dbName = 'NOMEDATABASE';
 private  $dbHost = 'localhost';
 private  $dbUsername = 'USERNAME';
 private  $dbUserPassword = 'PASSWORD';

 public function connect()    {
  return new PDO( "mysql:host=".$this->dbHost.";"."dbname=".$this->dbName, $this->dbUsername, $this->dbUserPassword);
 }
}
?>

Poi quando hai bisogno di fare una query:
PHP:
<?php
include_once 'database.php';

$db = new Database(); // Crei una istanza della classe database

$db = $db->connect(); // ti connetti al tatabase

// esegui la queri al database
$sql = "SELECT * FROM tabella";
$stmt = $db->prepare($sql);
$stmt->execute();

// salvi i risultati in una variabile
$risultati = $stmt->fetchAll();

?>

Come vedi per richiamare la connessione bastano 2 righe di codice.
Poi in caso dovessi cambiare le credenziali d'accesso al database (il nome del database, il tipo di database, ecc..), basta modificare un file invece che 100.





Per quanto riguarda la ricerca nel database, non è necessario (anzi è un errore) che l'utente debba inserire tutti quei dati.
L'utente dovrebbe inserire solamente il nome del cliente e recuperare gli interventi associati.
Per fare ciò devi fare una JOIN (nella query sql) tra la tabella dei clienti e la tabella degli interventi. Qui puoi trovare degli esempi.
E' una struttura un po' diversa da quella che abbiamo visto.. :sisilui: Abbiamo sempre implementato l'accesso in ogni pagina, pensa che non c'è stato detto neanche il codice contro l'SQL Injection, che sarà un argomento che porterò con relativa spiegazione su un file html e php..
 
Spiega meglio cosa vorresti fare di preciso e su quale file, cioè come si chiama...
Ovviamente ti sto solo aiutando sul codice che hai scritto che sicuramente va migliorato, però è un dettaglio.
 
Spiega meglio cosa vorresti fare di preciso e su quale file, cioè come si chiama...
Ovviamente ti sto solo aiutando sul codice che hai scritto che sicuramente va migliorato, però è un dettaglio.

1. Devo sistemare quella ricerca.php che è completamente errata, voglio che mi stamp TUTTI gli interventi inerenti a quel cliente, ricercandole mediante il Nome Cognome
2. L'inserimento dei dati se pur li inserisce nel database, causa dei problemi, il primo è che se la pagina viene aggiornata, viene caricata di continuo la query nel db, e per secondo, da un errore php inerente a un object...

Vorrei che questi 2 codici siano sistemati per bene, soprattutto il cerca.
 
Di seguito un esempio di come potrebbe essere la tua query cerca:

Una volta immessi in una variabile i parametri della ricerca:
PHP:
$search = 'Fra'; // Ad esempio le prime 3 lettere del nome del cliente: Francesco

Eseguiamo una query per cercare i dati.
PHP:
$sql = "SELECT intervento.Data_intervento, intervento.Costo, intervento.Descrizione, cliente.Nome, cliente.Cognome
    FROM intervento
    JOIN cliente ON intervento.Intervento_A = cliente.ID_Cliente
    WHERE cliente.Nome LIKE '" . $search . "%'
";

Questa query recupererà dal database i parametri Data_intervento, Costo, Descrizione dalla tabella intervento e Nome, Cognome dalla tabella cliente.
Ovviamente il tutto in funzione dei parametri di ricerca, ovvero una parte del nome del cliente. Questo è possibile utilizzando l'operatore LIKE.

Una volta ottenuti i dati, puoi stamparli nella pagina html con un ciclo foreach:
PHP:
foreach ($risultati as $value) {
    echo $value['Data_intervento'] . '<br>';
    echo $value['Nome'] . '<br>';
    echo $value['Cognome'] . '<br>';
    echo $value['Costo'] . '<br>';
    echo $value['Descrizione'] . '<br>';
}

NB. Nel caso sopra il risultato della query è un'array multidimensionale. E' comunque possibile avere come risultato della query un array di oggetti.
In tal caso quando per stamparli nella pagina html il ciclo foreach diventa:

PHP:
foreach ($risultati as $value) {
    echo $value->Data_intervento . '<br>';
    echo $value->Nome . '<br>';
    echo $value->Cognome . '<br>';
    echo $value->Costo . '<br>';
    echo $value->Descrizione . '<br>';
}
 
Di seguito un esempio di come potrebbe essere la tua query cerca:

Una volta immessi in una variabile i parametri della ricerca:
PHP:
$search = 'Fra'; // Ad esempio le prime 3 lettere del nome del cliente: Francesco

Eseguiamo una query per cercare i dati.
PHP:
$sql = "SELECT intervento.Data_intervento, intervento.Costo, intervento.Descrizione, cliente.Nome, cliente.Cognome
    FROM intervento
    JOIN cliente ON intervento.Intervento_A = cliente.ID_Cliente
    WHERE cliente.Nome LIKE '" . $search . "%'
";

Questa query recupererà dal database i parametri Data_intervento, Costo, Descrizione dalla tabella intervento e Nome, Cognome dalla tabella cliente.
Ovviamente il tutto in funzione dei parametri di ricerca, ovvero una parte del nome del cliente. Questo è possibile utilizzando l'operatore LIKE.

Una volta ottenuti i dati, puoi stamparli nella pagina html con un ciclo foreach:
PHP:
foreach ($risultati as $value) {
    echo $value['Data_intervento'] . '<br>';
    echo $value['Nome'] . '<br>';
    echo $value['Cognome'] . '<br>';
    echo $value['Costo'] . '<br>';
    echo $value['Descrizione'] . '<br>';
}

NB. Nel caso sopra il risultato della query è un'array multidimensionale. E' comunque possibile avere come risultato della query un array di oggetti.
In tal caso quando per stamparli nella pagina html il ciclo foreach diventa:

PHP:
foreach ($risultati as $value) {
    echo $value->Data_intervento . '<br>';
    echo $value->Nome . '<br>';
    echo $value->Cognome . '<br>';
    echo $value->Costo . '<br>';
    echo $value->Descrizione . '<br>';
}
Grazie lo stesso, non mi serve più.

Si può chiudere il topic.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top