Newsgroup: it.comp.www.php
Titolo: help me

Salve, premetto che ci capisco poco, ma sto provando a imparare qualche 
cosa.
Ho iniziato a leggere dei tutorial su una rivista e mi sono trovato 
davanti a uno script che mi interessava.
Si tratta in pratica di registrare un utente in MySQL per poi usare i 
suoi dati per accedere a una parte privata del sito.
Sembra che tutto funzioni a prima vista ma nel database non trovo niente.
Essendo alle prime armi non so' da che parte girarmi per risolvere da 
solo il problema.
Questo e' il semplice script di registrazione
<html>
<body>
<?php
     if(isset($_POST['username'])){
     mysql_connect("localhost","root");
     mysql_select_db("fmi");
     mysql_query("INSERT INTO utenti (Username, Password) VALUES 
({$_POST['username']},{$_POST['password']});");
     echo "Benvenuto nel sistema, {$_POST['username']}!";
}else{ ?>
     <form method="post" action="nuovoutente.php">
     Username: <input type="text" name="username"><br><br>
     Password: <input type="password" name="password"><br><br>
     <input type="submit" value="Aggiungi Utente">
     </form>
<?php }?>
</body>
</html>
Premetto che anche sulla rivista e' cosi!
I Nedd more Input!

invece di
 mysql_query("INSERT INTO ... ...$_POST['password']});");
fai
 mysql_query("INSERT INTO ... ...$_POST['password']});") or
die(mysql_error());
ti dovrebbe svelare l'arcano
Cristiano


 
In effetti mi ritorna
Unknown column 'pippo' in 'field list'
dove pippo e' il nome che ho inserito assieme alla password pluto.
Ma pippo dovrebbe essere uguale a {$_POST['username']} da inserire in 
Username?
Ci capisco sempre meno! SIGH!

dove pippo e' il nome che ho inserito assieme alla password pluto.
Non e' che ti sei dimenticato di metterlo fra apici nella query?
	INSERT INTO tabella VALUES (pippo, pluto);
ti darebbe quell'errore.
mysql> create table tabella ( x varchar(20), y varchar(20) );
Query OK, 0 rows affected (0.21 sec)
mysql> INSERT INTO tabella VALUES (pippo, pluto);
ERROR 1054: Unknown column 'pippo' in 'field list'
mysql> INSERT INTO tabella VALUES ('pippo','pluto');
Query OK, 1 row affected (0.00 sec)
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 Leonardo
Perfettamente ragione se inserisco i valori a mano ma io devo prenderli 
da un form con questo script;
<html>
<body>
<?php
     if(isset($_POST['username'])){
     mysql_connect("localhost","root");
     mysql_select_db("fmi");
     mysql_query("INSERT INTO utenti (Username, Password) VALUES 
({$_POST['username']},{$_POST['password']});")or die(mysql_error());
     echo "Benvenuto nel sistema, {$_POST['username']}!";
}else{ ?>
     <form method="post" action="nuovoutente.php">
     Username: <input type="text" name="username"><br><br>
     Password: <input type="password" name="password"><br><br>
     <input type="submit" value="Aggiungi Utente">
     </form>
<?php }?>
</body>
</html>
l'errore lo vedo adesso che Cristiano mi ha suggerito di inserire
or die(mysql_error());
perche' prima non capivo nemmeno cosa succedeva, ora anche meno.
I need more clue!

I need more clue!
Cerchi nel tuo script una riga simile a quella che ho scritto io e
metti gli apici nei punti corrispondenti :-)))
Altre due cose che non vanno, in quello script, sono:
	- gli array non sicuri $_POST, $_GET, $_REQUEST non devono
	  mai entrare in contatto diretto con il codice SQL
	- le password non vanno mai inserite in chiaro nel DB


 Leonardo
Grazie GNU(bbo)

 Leonardo
mysql_query("INSERT INTO utenti ('Username', 'Password') 
VALUES({$_POST[username]},{$_POST[password]});")or die(mysql_error());
Non riesco a capire se mi vuoi dare una mano o no! OK dove metto sti apici?
VALUES('{$_POST[username]}','{$_POST[password]}')
VALUES({'$_POST[username]'},{'$_POST[password]'})
VALUES({$_POST['username']},{$_POST['password']})
Sono solo tre possibilita'  e lo ho provate tutte
Cristo non devo diventare un genio di php devo solo fare sto cavolo di 
script di registrazione e poi quello di accesso. La sicurezza in un 
sistema chiuso e' superflua ed e' il mio caso.
Grazie

Sono solo tre possibilita'  e lo ho provate tutte
...era quasi la prima.
VALUES('{$_POST['username']}','{$_POST['password']}')
Con due coppie di apici.
Questo perche' gli apici piu' esterni sono di MySQL, mentre quelli
piu' interni, sono resi necessari dall'uso delle graffe. In questo
caso potevi farne a meno, questa e' la quarta versione compatta:
VALUES('$_POST[username]','$_POST[password]')
Qui non usi le graffe, quindi ti servono solo gli apici dell'SQL.
Meglio ancora puoi usare $_REQUEST invece di $_POST.


proprio con $_POST..
Be', immagina di scrivere
	SELECT COUNT(*) FROM users WHERE username='$_POST[user]'
		AND MD5('$_POST[pass]') = password;
Normalmente ti ritorna 1 se l'utente c'e' ed ha la password, e 0 se non
c'e' l'utente.
Questo nel caso che io mi logghi come utente
		pippo
Ma se mi loggo con password PUPPA ed utente
		' OR true LIMIT 1; --
la query diventa:
	SELECT COUNT(*) FROM users WHERE username='' OR true LIMIT 1; -- '
		AND MD5('PUPPA') = password;
e siccome -- e' il commento SQL, ottieni:
	SELECT COUNT(*) FROM users WHERE username='' OR true LIMIT 1;
che ritorna 1. L'utente e' considerato loggato.
Oppure, uso l'utente "admin'; --"
e una query per recuperare i dati diventa
	SELECT * FROM users WHERE username='admin';
consentendo al primo che passa di loggarsi con diritti di amministratore
del sistema.
Un metodo rozzo per evitare questo guaio (ma non altri) e'
	$user = md5($_REQUEST['user']);
	$pass = md5($_REQUEST['pass']);
	SELECT * FROM users WHERE MD5(username)='$user'
		AND password='$pass';
un altro sistema e' ripulire user e pass usando ereg o preg_match e forse
dando anche l'allarme.
Gia' che ci sei, se vedi che dentro user compaiono caratteri sospetti con
aroma di SQL, puoi registrare i dati del chiamante e morire con un errore
copiato da MySQL:
	print "MySQL error: you have an error in $QUERY near 'WHERE...'"
Questo terra' utilmente impegnato il marpione a cercare di indovinare con
quale magica sequenza di caratteri puo' riuscire a entrare. Piu' ci prova
e piu' tracce lascia, che e' sempre un bene :-)


Leonardo Serni wrote:
E vai! funziona.

 E vai! funziona.
Ci dici alla fine dove hai trovato questo tutorial (che dovrebbe essere
vietato per alcune mancanze... )? 
;-)

 Leonardo
Grazie ancora
GNU(bbo)

OST[email]', '$data_iscr')";
Potresti fare cosi' (nota che il codice e' riciclable, cambia solo
$campi e $SQL), dopo aver corretto gli errori che avro' infilato:
	$campi = array(
		'nome'		=> "nome|mandatory|[A-Za-z ']*",
		'cognome'	=> "cognome|mandatory|[A-Za-z ']*",
		'data_iscr'	=> "$data_iscr|forced|",
		...
	);
// Per ogni campo specifichiamo da dove proviene, se e' obbligatorio od
// opzionale o se lo forziamo noi, e quale regexp deve soddisfare; p.e.
// un nome e' [A-Za-z ']*; un indirizzo, conterra' anche numeri e /, un
// CAP sara' [0-9]{5} (se ricordo bene); provincia, [A-Z][A-Z].
	$SQL = "INSERT INTO news_utenti";
	$flds = '';
	$vals = '';
	$comma = '';
	$missing = '';
	$wrong	 = '';
	foreach($campi as $fld => $raw)
	{
		$data = explode('|', $raw);
		switch($data[1])
		{
			case 'mandatory':
				if (!isset($_REQUEST[$fld]))
				{
					$missing .= " $fld";
					break;
				}
				$val = trim($_REQUEST[$fld]);
				if ('' == $val)
				{
					$missing .= " $fld";
					break;
				}
				if (!preg_match("/^data[2]$/", $val))
				{
					$wrong .= " $fld";
					break;
				}
				break;
			case 'forced':
				$val = $data[0];
				break;
			...
		}
		$flds .= "$comma$fld";
		// Il valore viene comunque protetto con AddSlashes. Altre
		// funzioni utili: QuoteMeta, EscapeShellChars, eccetera.
		$vals .= $comma . is_numeric($val) ? $val: "'" .
AddSlashes($val) . "'";
		$comma = ', ';
	}
	$ok = 1;
	if ('' != $missing)
	{
		$ok = 0;
		print "I seguenti campi non sono compilati: $missing.";
	}
	if ('' != $wrong)
	{
		$ok = 0;
		print "I seguenti campi sono compilati in modo non
corretto: $wrong.";
	}
	if ($ok)
	{
		$SQL .= " ($flds) VALUES ($vals);";
		mysql_query($SQL, $conn);
		// Controllo errori sulla query
	}
	else
		exit();
