Su Mac funziona - su windows da warning

  • Creatore Discussione Creatore Discussione pup3770
  • Data di inizio Data di inizio

pup3770

Utente Attivo
30 Mag 2012
122
0
16
Buongiorno a tutti,
come da titolo ho un piccolo problemino che non sono riuscito a risolvere. Ho creato un mini sistema di login in pagina php; in pratica avvio MAMP ed eseguo la pagina e funziona, avvio EasyPHP e mi da segnali di Warning.

PHP:
<?php
ob_start();
?>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> Effettua il login </title>
<body>

</head>

<P ALIGN="CENTER">
	<FONT COLOR="#FF0000" SIZE = 7> Effettua il login </FONT>
	</P>

<!TARGET="_blank" se lo si aggiunge nel form dopo action apre un'altra pagina dove mostra quello che c'è in action>

<FORM METHOD="post" ACTION="login_ospedale.php"> 
<b>User:</b><br> <INPUT TYPE="text" NAME="user" VALUE="Inserisci un termine" ONFOCUS="if(this.value==this.defaultValue)this.value=''"><br><br>

<b>Password:</b><br> <INPUT TYPE="password" NAME="password"><br><br>

	<INPUT TYPE="submit" VALUE="Effettua Login">
	</FORM>	


	<div style="float:right;">
	<P ALIGN="CENTER">
<FORM ACTION="login_admin.php">	
	<INPUT NAME="print_farmaco" TYPE="image" SRC="logo_login_admin.jpg" ALT="non toccare" TITLE="login_admin" WIDTH="100" HEIGHT="100">
	</P>
	</div>
	</FORM>


<?php
	$connessione = mysql_connect("localhost","root","") or die ("ATTENZIONE: Errore di connessione al server\n");
	$selezione_db = mysql_select_db("Ospedale",$connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");


        $query = "SELECT * FROM Utenti";
	$result = mysql_query($query, $connessione);
	$numrows = mysql_num_rows($result);


$u = $_POST['user']; //username che inserisce l utente nel form

$p = $_POST['password']; //password che inserisce l utente nel form


//Avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for($x=0; $x<$numrows; $x++){
    //Recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result); //mysql_fetch_row() recupera il contenuto dei record trovati. Più precisamente restituisce un array contenente i valori di ogni campo riscontrati nel recordset
    
    $username = $resrow[0]; //username che preleva dal server
    $password1 = $resrow[1]; //password che preleva dal server
 

$indirizzo = 'scelta_operazione_ospedale.html';

if(($username == $u) and ($password1 == $p))
	
header('Location: ' . $indirizzo); //link ad una pagina che in questo caso è nella variabile - indirizzo -


}    


?> <!fine codice php>


</body>
</html>

I messaggi che mi vengono restituiti sono:
Notice: Undefined index: user in C:\Program Files (x86)\EasyPHP-12.1\www\login_ospedale.php on line 48

Notice: Undefined index: password in C:\Program Files (x86)\EasyPHP-12.1\www\login_ospedale.php on line 50

Il mio obiettivo era quello di: grazie ai due campi di inserimento, di permettere all'utente di inserire lo USER e la PASSWORD che successivamente prelevo e confronto con i dati presenti nel database ed eseguo una redirezione.
Ho provato a cercare su google ma le diverse soluzioni non hanno portato esito positivo, forse sbaglio in qualcosa.

Grazie in anticipo
 
ciao
ci sono molte cose che non mi tornano
1) immagino che con <! tu intenda scrivere un commento html, i commenti html si scrivono
HTML:
<!-- commento... -->
su una o più righe
2) inizi la pagina con
PHP:
<?php
ob_start();
?>
giustamente in quanto usi header dopo l'uotput html, in quel caso devi finirla con
PHP:
<!-- ....... -->
</body>
</html>
<?php
ob_end_flush();
?>
3) usi due form nella stessa pagina (a che serve il secondo?), conviene, se servono, distinguerli con name
4) username e password in quella maniera si prestano molto bene alle cros injection come minimo dovresti, es.,
PHP:
$u = addslashes($_POST['user']); //username che inserisce l utente nel form
la password poi sarebbe meglio codificata e salvata come minimo con md5 o meglio sah2
5) perche fai quell'ambaradan per verificare se user e pass sono nel db?
ti basta modificare la query (metto i nomi dei campi a caso)
PHP:
<?php
//.....
$query = "SELECT * FROM Utenti WHERE pass='$p' AND user='$u'";
$result = mysql_query($query, $connessione);
if(mysql_num_rows($result) > 0({
	header("Location:  $indirizzo");//dove valorizzi $indirizzo ?
}
//......
?>
6) come fa lo script a capire che è stato premuto il submit o no?
7) è convenzione scrivere i tag html in minuscolo

per ora credo che ti basti, prova a modificare e e eventualmente chiedi di nuovo
 
Ciao, la cosa che non mi torna è che su MAMP o server LINUX funziona perché utilizzo il listato anche in altre pagine.
Si effettivamente il campo 5 potrei snellirlo molto.

Adesso l'ho modificato così:

PHP:
<?php
ob_start();
?>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> Effettua il login </title>
<body>

</head>

<P ALIGN="CENTER">
	<FONT COLOR="#FF0000" SIZE = 7> Effettua il login </FONT>
	</P>

<!TARGET="_blank" se lo si aggiunge nel form dopo action apre un'altra pagina dove mostra quello che c'è in action>

<FORM METHOD="post" ACTION="login_ospedale.php"> 
<b>User:</b><br> <INPUT TYPE="text" NAME="user" VALUE="Inserisci un termine" ONFOCUS="if(this.value==this.defaultValue)this.value=''"><br><br>

<b>Password:</b><br> <INPUT TYPE="password" NAME="password"><br><br>

	<INPUT TYPE="submit" VALUE="Effettua Login">
	</FORM>	


	<div style="float:right;">
	<P ALIGN="CENTER">
<FORM ACTION="login_admin.php">	
	<INPUT NAME="print_farmaco" TYPE="image" SRC="logo_login_admin.jpg" ALT="non toccare" TITLE="login_admin" WIDTH="100" HEIGHT="100">
	</P>
	</div>
	</FORM>


<?php
	$connessione = mysql_connect("localhost","root","") or die ("ATTENZIONE: Errore di connessione al server\n");
	$selezione_db = mysql_select_db("Ospedale",$connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");


        $query = "SELECT * FROM Utenti";
	$result = mysql_query($query, $connessione);
	$numrows = mysql_num_rows($result);


$u = $_POST['user']; //username che inserisce l utente nel form

$p = $_POST['password']; //password che inserisce l utente nel form


//Avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for($x=0; $x<$numrows; $x++){
    //Recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result); //mysql_fetch_row() recupera il contenuto dei record trovati. Più precisamente restituisce un array contenente i valori di ogni campo riscontrati nel recordset
    
    $username = $resrow[0]; //username che preleva dal server
    $password1 = $resrow[1]; //password che preleva dal server
 

$indirizzo = 'scelta_operazione_ospedale.html';

if(($username == $u) and ($password1 == $p))
	
header('Location: ' . $indirizzo); //link ad una pagina che in questo caso è nella variabile - indirizzo -


}    


?> <!fine codice php>
	

<P ALIGN="CENTER">
<font SIZE = 3> &copy; Product by Alessandro Rosina </font><br>
<font SIZE = 3> tel: 3400845664 </font><br>
<font SIZE = 3> e-mail: [email protected] </font><br>
<font SIZE = 3> Ultimo aggiornamento applicazione: 12-09-2012 20:19:15 </font><br>
</P>

</body>
</html>

<?php 
ob_end_flush(); 
?>

Adesso funziona tranquillamente, solo che mi da sempre dei notice:
Notice: Undefined index: user in C:\Program Files (x86)\EasyPHP-12.1\www\login_ospedale.php on line 48

Notice: Undefined index: password in C:\Program Files (x86)\EasyPHP-12.1\www\login_ospedale.php on line 50

In merito al punto 1) , si sono commenti.
In merito ai TAG, hai ragione. Appena ho un attimo li riscrivo in minuscolo.

I Notica che mi da da quello che vede sono dei difetti dovuti alla non definizione del punto dei campio: "user" e "password".
Ma non credo che modificandolo come da te suggerito al punto 4) risolva qualcosa.
 
ciao
è logico che ti dia quei due warning (e sarebbe sorprendente se non li desse)
immagino (se non ho contato male) le righe 48 e 50 sono i due
PHP:
$u = $_POST['user']; //username che inserisce l utente nel form
$p = $_POST['password']; //password che inserisce l utente nel form
è logico perchè non avendo messo il controllo del submit quando chiami la pagina lo script viene comunque eseguito anche se non hai compilato il form. non avendo compilato il form i due $_POST non esistono, da cui il notice

se hai pazienza ti butto giu uno schema di come dovrebbe essere fatto.


p.s.
te lo butto giu usando le vecchie mysql, ma tu devi passare a mysqll o alla classe PDO, le vecchie mysql stanno per essere eliminate
 
ciao
ecco uno schema
penso che i commenti siano abbastanza chiari
PHP:
<?php
ob_start();
session_start();//le sessioni ti serviranno poi nelle pag riservate, altimenti il log non serve a nulla
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>effettua il login</title>
</head>
<body>
<?php
if(isset($_POST['log'])){//verifico che sia stato premuto il submit
	$u=trim(addslashes($_POST['user']));
	$p=trim(addslashes($_POST['password']));
	if($u !="" && $p !=""){//se user e pass non vuote le verifico nel db
		$connessione = mysql_connect("localhost","root","") or die ("ATTENZIONE: Errore di connessione al server\n");
    	$selezione_db = mysql_select_db("Ospedale") or die ("ATTENZIONE: Errore nella selezione del database\n");
		$query="SELECT * FROM Utenti WHERE username='$u' AND password='$p'";
		$result=mysql_query($query);
		if(mysql_num_rows($result)>0){//se esistono mando a dove deve andare
			$_SESSION['utente']=$u;//vedi commento a session_start
			header("Location:  $indirizzo"); //come detto da dove salta fuori $indirizzo?
			exit();
		}
		echo "username o password non esistenti";
	}
	echo "username o password non compilata";
	header( "refresh:3;url={$_SERVER['PHP_SELF']}" );//ritorno al form pulito dopo 3 secondi
	exit();
}else{
?>
<p align="center">
<font color="#FF0000" size = 7> Effettua il login </font>
</p>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" name="primo">
	<b>User:</b><br />
	<input type="text" name="user" value="Inserisci un termine" onfocus="if(this.value==this.defaultValue)this.value=''"><br /><br />
	<b>Password:</b><br />
	<input type="password" name="password"><br><br>
	<input type=="submit" name="log" value="Effettua Login">
</form>  
<div style="float:right;">
	<p align="center">
	<form action=="login_admin.php"><!-- questo non capisco a che ti serva -->  
    <input type="print_farmaco" type="image" src="logo_login_admin.jpg" alt="non toccare" titlt="login_admin" width="100" height="100">
    </p>
    </form>
</div>
<p align="center">
<font size = 3> &copy; Product by Alessandro Rosina </font><br>
<font size = 3> tel: 3400845664 </font><br>
<font size = 3> e-mail: [email protected] </font><br>
<font size = 3> Ultimo aggiornamento applicazione: 12-09-2012 20:19:15 </font><br>
</p>
<?php
}//fine dell'if-else submit
?>
</body>
</html>
<?php 
ob_end_flush(); 
?>
poi stai attento:
non indentare i tag html e non usare il tag font e align (obsoleti). ma usa i css meglio se esterni

poi un consiglio: se non vuoi farti riempire di spam non mettere il tuo indirizzo email in chiaro, ma fatti la classica pagina contatti
 
Grazie mille per i consigli.
Capisco che mi hai dedicato molto del tuo tempo. Io ho provato il codice che mi hai mandato ma non mi appare il tasto "submit".

Ad essere sincero, ho risolto in maniera bruta e semplice per me che non conosco i CSS e vorrei tanto imparare ad usarli, nel seguente modo:

PHP:
<?php
ob_start();
?>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> Effettua il login </title>
<body>

</head>

<P ALIGN="CENTER">
	<FONT COLOR="#FF0000" SIZE = 7> Effettua il login </FONT>
	</P>

<!TARGET="_blank" se lo si aggiunge nel form dopo action apre un'altra pagina dove mostra quello che c'è in action>

<FORM METHOD="post" ACTION="login_ospedale.php"> 
<b>User:</b><br> <INPUT TYPE="text" NAME="user" VALUE="Inserisci un termine" ONFOCUS="if(this.value==this.defaultValue)this.value=''"><br><br>

<b>Password:</b><br> <INPUT TYPE="password" NAME="password"><br><br>

	<INPUT TYPE="submit" name="login" VALUE="Effettua Login">
	</FORM>	


	<div style="float:right;">
	<P ALIGN="CENTER">
<FORM ACTION="login_admin.php">	
	<INPUT NAME="print_farmaco" TYPE="image" SRC="logo_login_admin.jpg" ALT="non toccare" TITLE="login_admin" WIDTH="100" HEIGHT="100">
	</P>
	</div>
	</FORM>


<?php

	$connessione = mysql_connect("localhost","root","") or die ("ATTENZIONE: Errore di connessione al server\n");
	$selezione_db = mysql_select_db("Ospedale",$connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");
  
if(isset($_POST['login'])){ //verifico che sia stato premuto il bottone Effettua login

        $query = "SELECT * FROM Utenti";
	$result = mysql_query($query, $connessione);
	$numrows = mysql_num_rows($result);


$u = $_POST['user']; //username che inserisce l utente nel form

$p = $_POST['password']; //password che inserisce l utente nel form


//Avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for($x=0; $x<$numrows; $x++){
    //Recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result); //mysql_fetch_row() recupera il contenuto dei record trovati. Più precisamente restituisce un array contenente i valori di ogni campo riscontrati nel recordset
    
    $username = $resrow[0]; //username che preleva dal server
    $password1 = $resrow[1]; //password che preleva dal server
 

$indirizzo = 'scelta_operazione_ospedale.html';

if(($username == $u) and ($password1 == $p))
	
header('Location: ' . $indirizzo); //link ad una pagina che in questo caso è nella variabile - indirizzo -


}
echo "Username o Password non esistenti";

}


else{
echo "Username o Password non inseriti";
}

?> <!fine codice php>
	

</body>
</html>

<?php 
ob_end_flush(); 
?>

Ho pensato di lasciarlo così e non toccarlo più sai perché? Perché questo realmente non è uno strumento online ma uno strumento di semplice utilizzo che serve ad un infermiere per fare il carico/scarico di farmaci presenti nel frigo di un reparto ospedaliero. Infatti girerà in locale e non online. Avevo pensato di farlo in java o c ma è da tanto che non programmo.

Comunque apprezzo i tuoi consigli e ti terrò cari per le mie future produzione che spero siano più commerciali. Attualmente non posso dedicarmi molto perché oltre al lavoro studio ed ho una materia tra meno di un mese.

Saluti e grazie ancora. Complimenti per la tua conoscenza nel campo.
 
Ma comunque, anche se come da te evidenziato ci sono errori o problemi di programmazione, strano che su UNIX non dia questi problemi. Chissà come mai?
 
Ma comunque, anche se come da te evidenziato ci sono errori o problemi di programmazione, strano che su UNIX non dia questi problemi. Chissà come mai?
ciao
questo non so dirtelo, anche se mi sempbra strano, php è php (almeno dovrebbe).
poi da quello che mi dici a maggior ragione devi fare il controllo su user e pass con una sql injection un pinco pallo qualsiasi puo caricare/scaricare morfina, tanto poi il responsabile è chi ha la pass.
con una buona sql injection posso tirare fuori tutti gli user e le pass
 
Si infatti anche a me non torna il discorso che su UNIX funziona. Cmq quello che dici è correttissimo solo che non conosco le injection. Provvedo a studiare e ti faccio sapere allora. Se hai modo di darmi una infarinatura anche in questo post sarà di certo gradita
 
ciao
intanto una cosa per la sicurezza.
non so come attribuisci le password, se le attribuisci tu o se le scelgono gli operatori, comunque ti schematizzo
1) attribuzione
hai un form in cui uno (o tu) inserisce l'username e la password, quando inserisci nel db
PHP:
<?php
//...soliti dati di connessione
$username=addslashes($_POST['username']);
$password=sah1(_POST['password']);//codifichi la password
//ti conviene verificare se la password gia esiste per non avere duplicati
$query=mysqk_query("SELECT pass FROM utenti WHERE pass='$password'");
if(mysql_num_rows($query) > 0){
	echo "password gia esistente cambiarla e ripetere";
}else{
	//fai l'insert dell'username e passwor nella tabella
}
?>
se ti interessa guarda
http://it1.php.net/manual/en/function.sha1.php
2) log dell'utente
dal form di log riceverai il $_POST, lo codifichi
PHP:
$p=sah1(_POST['password']);
e fai la verifica.
inoltre usa le sessioni come ti ho detto perche, ti faccio un esempio:
se un malentenzionato riesce a sapere come si chiama la pagina in cui l'operatore fa le varie operazioni (ipotesi si chiami opera.php)
può scrivere sul bw o sulla linea di comendo es.
http: // www.carico .it / opera.php
cioè con un link diretto
ed accedere alla pagina, ma se usi le sessioni: passi es l'username e/o la password in sessione nella pag di log e inizi la opera.php con
PHP:
<?php
session_start();
if(!isset($_SESSION['username'])){//o $_SESSION['password'] o verifchi entrambe
	//la sessione non esiste
	header('location:index.php');// o dove preferisci
	exit();
}
//e qui il resto
?>
in questo modo il malentenzionato non riesce ad accedere
 

Discussioni simili