Mantegnous
Utente Attivo
- Messaggi
- 843
- Reazioni
- 42
- Punteggio
- 67
Segui il video qui sotto per vedere come installare il nostro sito come web app sulla tua schermata principale.
Nota: Questa funzionalità potrebbe non essere disponibile in alcuni browser.
Pubblicità
Lo so che è vulnerabile.. deve essere un progetto per fine anno, da presentare a una commissione..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.
<!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>
<?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;
}
?>
Ok, editato il login.php.. per quanto riguardo l'inserimento (input.php), so che è sbagliato fatto in quel modo ma inserire li inserisce i datiLogin.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.
input.php - Pastebin.com[/url]
if(!isset($_SESSION['login']) == "autorizzato")
{
Print "Accesso non consentito";
Exit();
}
Fatto e funziona, quando sta autenticato carica la pagina, quando non lo è, tipo quando chiudo il browser da l'errore.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.
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
<?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);
}
}
?>
<?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();
?>
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.
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..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.
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.
$search = 'Fra'; // Ad esempio le prime 3 lettere del nome del cliente: Francesco
$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 . "%'
";
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>';
}
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ù.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>'; }