registrazione utenti...

  • Creatore Discussione Creatore Discussione angel
  • Data di inizio Data di inizio

angel

Utente Attivo
2 Nov 2009
109
0
0
Ciao mi date una mano a creare che gli utenti si possano registrare...
la tabella che uso...
PHP:
CREATE TABLE forum_utenti` (
  `id_utenti` int(11) NOT NULL AUTO_INCREMENT,
  `nome_utenti` varchar(255) NOT NULL DEFAULT '',
  `password_utenti` varchar(255) NOT NULL DEFAULT '',
  `data_utenti` varchar(255) NOT NULL DEFAULT '',
  `mail_utenti` varchar(255) NOT NULL DEFAULT '',
  `attivo_utenti` enum('0','1') NOT NULL DEFAULT '0',
  `gruppi_utenti` varchar(255) NOT NULL DEFAULT 'utente',
  `messaggi_utenti` int(11) NOT NULL DEFAULT '0',
  `avatar_utenti` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id_utenti`)
) TYPE=MyISAM AUTO_INCREMENT=1;

mi date una mano a buttare giu il codice...
 
ciao
per prima cosa dovresti creare un form in cui l'utente deve inserire i dati che vuoi tu.
es. la password l'assegni tu o deve inventarsela l'utente? e quali campi deve riempire? e quali assegni tu?
poi alcune altre cose es. l'avatar deve caricarlo lui? o deve inserire un link?
inoltre, secondo me ma puo darsi che sbagli, dovresti leggermente modificare la tabella:

`password_utenti` varchar(255) NOT NULL DEFAULT '', a che ti servono 255 caratteri? quando una pass è lunga 12 al massimo può andare bene
'data_utenti` varchar(255) NOT NULL DEFAULT '', è la data in cui l'utente si iscrive? se si sarebbe meglio o tipo date o tipo int(15) inserendo l data in temestamp

`gruppi_utenti` varchar(255) NOT NULL DEFAULT 'utente', intendi utente o moderatore o amministatore con privilegi?

precisa intanto questo, poi siamo qui
 
Già fatto ecco...
PHP:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table width="600px" border="0">

<tr>
<td>Nome:</td>
<td><input type="text" name="nome"></td>
</tr>
<tr>
<td>Password:</td>
<td><input  type="password" name="password"></td>
</tr>
<tr>
<td>Conferma Password:</td>
<td><input type="password" name="conferma_password"></td>
</tr>
<tr>
<td>Mail:</td>
<td><input type="text" name="mail"></td>
</tr>
<tr>
<td>Avatar:</td>
<td><input type="text" name="avatar"></td>
</tr>
<tr>
<td><input type="submit" name="invia" value="INVIA"></td>
<td><input type="reset" value="RESET"></td>
</tr>

</table>
</form>
<?php
if(isset($_POST["invia"])){
$nome=$_POST["nome"];
$password=$_POST["password"];
$password2=$_POST["conferma_password"];
$mail=$_POST["mail"];
$avatar=$_POST["avatar"];

if($nome == ""){
echo("<b>Il campo Nome è vuoto</b>\n");
exit;
}elseif($password == ""){
echo("<b>Il campo Password è vuoto</b>\n");
exit;
}elseif($password2 == ""){
echo("<b>Il campo Conferma Password è vuoto</b>\n");
exit;
}elseif($password != $password2){
echo("<b>Le password non coincidono</b>\n");
exit;
}elseif($mail == ""){
echo("<b>Il campo Mail è vuoto</b>\n");
exit;
}

}?>

no la pass la sceglie lui ma io volevo fare che quando lui si registra gli venga inviata una mail per confermare la registrazione con 2 link uno di conferma e uno di annullamento...
se l'utente non conferma la registrazione non va in porta ma non so come fare....

avatar lui deve mettere un link deve essere messo su un altro sito...
ma non e importante

per i gruppi hai indovinato essendo che poi dovrò usare le sessione o i cookie...

per data mi serve che deve essere cosi
19/2/2009, 11:26
ma non so cosa mettere nella tabella e nel codice php^^
 
Qualche piccolo consiglio. Per quanto riguarda la password io consiglio di codificarla con l'algoritmo SHA1, in modo che sia più sicuro. MD5 se non sbaglio è stato crackato nel 2005. Così non hai neanche il problema della lunghezza del campo della password nella tabella, giacché tutti gli hash generati da SHA1 sono di 40 caratteri.

Per il campo della data ti consiglio di utilizzare un campo BIGINT da 20, che sarebbe anche troppo lungo, ma non si sa mai... metti che la tua applicazione arriverà fino all'anno 3016? :eek:

Passando al discorso dei permessi invece non posso che citarti un articolo che venne pubblicato molto tempo fa su HTML.it, che ti spiegava come creare un sistema di autenticazione permettendo o negando agli utenti certe azioni analizzando i bit contenuti nell'ID di ogni permesso. L'articolo in questione è: http://php.html.it/articoli/leggi/901/gestire-gli-utenti-con-php/. Spiega anche molte altre cose, quindi dovrebbe risolvere la maggior parte dei tuoi problemi.

Ciao,
Alessandro
 
ciao
oltre a quello che dice alesandro1997 (giusto 1997?) dovresti:
1. per i campi vuoti mettere (anche) un controllo js in modo che se non riempiti non prosegua
2. il controllo dovrebbe riguardare anche la forma del nome e poi della password (es. sono caratteri alfanumerici A-Za-z0-9)
3. per la pass devi verificare che non ne esista un'altra uguale (n deve/dovrebbe esistere due pass uguali)
4. una verifica dell'email (es. non puo essere pinco/pallo#bonco,la)


poi se hai pazienza (domani o luni) ti metto giu uno schema
 
cosa ne pensi tipo cosi....
Credo che ci sono degli errori...
per il campo data o dubbi...^^
PHP:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table width="600px" border="0" align="center">

<tr>
<td>Nome:</td>
<td><input type="text" name="nome"></td>
</tr>
<tr>
<td>Password:</td>
<td><input  type="password" name="password"></td>
</tr>
<tr>
<td>Conferma Password:</td>
<td><input type="password" name="conferma_password"></td>
</tr>
<tr>
<td>Mail:</td>
<td><input type="text" name="mail"></td>
</tr>
<tr>
<td>Avatar:</td>
<td><input type="text" name="avatar"></td>
</tr>
<tr>
<td>Scrivi ciao:</td>
<td><input type="text" name="parola"></td>
</tr>
<tr>
<td><input type="submit" name="invia" value="INVIA"></td>
<td><input type="reset" value="RESET"></td>
</tr>

</table>
</form>
<?php
if(isset($_POST["invia"])){
$nome=$_POST["nome"];
$password=$_POST["password"];
$password2=$_POST["conferma_password"];
$mail=$_POST["mail"];
$avatar=$_POST["avatar"];
$parola=$_POST["parola"];

if($nome == ""){
echo("<b>Il campo Nome è vuoto</b>\n");
exit;
}elseif($password == ""){
echo("<b>Il campo Password è vuoto</b>\n");
exit;
}elseif($password2 == ""){
echo("<b>Il campo Conferma Password è vuoto</b>\n");
exit;
}elseif($password != $password2){
echo("<b>Le password non conicidono</b>\n");
exit;
}elseif($mail == ""){
echo("<b>Il campo Mail è vuoto</b>\n");
exit;
}elseif($mail == "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"){
echo("<b>Il campo mail non è corretto</b>\n");
exit;
}elseif($parola == ""){
echo("<b>Il campo parola è vuoto</b>\n");
exit;
}elseif($mail != "ciao"){
echo("<b>Il campo parola è Sbagliato</b>\n");
exit;
}else
require("config.php");

$query1 = mysql_query("SELECT * FROM forum_utenti WHERE nome_utenti = '".$nome."'");
if(mysql_num_rows($query1) != "0"){
echo("<b>Il Nome già esiste</b>\n");
exit;
}
$query2 = mysql_query("SELECT * FROM forum_utenti WHERE mail_utenti = '".$mail."'");
if(mysql_num_rows($query2) != "0"){
echo("<b>La mail già esiste</b>\n");
exit;
}
$password=sha1($password);
$data=date("d-m-y").", ".date("G:i");
mysql_query("INSERT INTO `forum_utenti` (
`nome_utenti`, 
`password_utenti`, 
`data_utenti`, 
`mail_utenti`, 
`avatar_utenti`
) VALUES(
'".mysql_real_escape_string(htmlentities($nome))."', 
'".mysql_real_escape_string(htmlentities($password))."', 
'".$data."', 
'".$mail."',
'".mysql_real_escape_string(htmlentities($avatar))."'
);
");

}?>
 
borgoitalia, quello che hai detto non è vero in due punti. Il primo riguarda il controllo in Javascript, che mi sembra facile eludere. Basta disabilitarlo e posso inserire nei campi tutto quello che voglio. Sono d'accordo sul fatto che metterlo è figo, ma comunque lasciare anche un controllo lato server.

La seconda parte riguarda la password. Perché dici che non ne possono esistere due uguali? Ti confondi, non possono esistere due username uguali, per la password non c'è problema. Comunque potrebbe anche essere un rischio per la sicurezza mettere un controllo del genere. Non vedo cosa c'è di male se sia l'utente pinco che pallo hanno la password rosebud. Tanto lo username cambia comunque!
 
ciao
non ho detto di togliere il controllo php ma di aggiungere uno js che è comodo se uno si dimentica. poi è facile che ci siano due mario rossi, per quello è meglio pass unica.
comunque veniamo allo script
1. nei vari $_POST fai
PHP:
$nome=strip_tags(trim($_POST["nome"]));
strip_tags impedisce l'inserimento di codice malevolo, trim elimina spazi e caratteri non stampabili (es se uno inserisce uno spazio se non metti trim la password risulta riempita)
2. usa nei controlli nome e pass che uno scriva i carattarei alfanumerici

es per nome eregi("^([A-Za-z0-9]_ ){4,12})$", $nome) e (nota dopo _ c'è uno spazio)
per pass ereg("^(a-z0-9]){4,12})$", $password) solo caretteri alfabetici o numerici
e uno deve immettere nome o pass di minimo 4 o massimo 12 caratteri, puoi scegliere tu min e max
eregi è caseinsensitive, ereg è casesensitive
per cui gli if diventano

PHP:
if($nome == "" || !eregi("^([A-Za-z0-9]_  ){4,12})$", $nome)){ 
echo("<b>Il campo Nome è vuoto o caratteri non ammessi</b>\n"); 
exit; //ecc...

PHP:
}elseif($mail =="" ||  !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"), $mail)){ 
echo("<b>Il campo mail non è corretto</b>\n"); 
exit;

3. al posto di exit (che non ti da il tempo di leggere il messaggio) io metterei
PHP:
echo "<meta http-equiv='Refresh' content='3; URL=mia_pagina.php>"; // ... ritorna a form
dove con mia_pagina.php è il nome della pagina con il form, l'eventuale errore ti riporta al form pulito dopo 3 secondi
(contet='3 ....) puoi mettere quanti secondi vuoi di attesa

4. l'elseif
}elseif($mail != "ciao"){
echo("<b>Il campo parola è Sbagliato</b>\n");
non dovrebbe essere
}
PHP:
elseif($parola != "ciao"){ 
echo("<b>Il campo parola è Sbagliato</b>\n"); //?

5. se devi fare il doppio controllo invece di due elseif metti l'OR oppure ||
6. metti dopo else la graffa else{ graffa che chiuderai prima dell'ultima graffa
PHP:
"); 
}
}?>

7. per la data metti il tipo di campo come ti ha detto alessandro1997 BIGINT(20) e
PHP:
$data=time();
dopo è molto più semplice fare eventuali ordinamenti e/o calcoli sugli intervalli di tempo, poi la visualizzi
nel formato che preferisci es:
PHP:
echo date("d-m-y G:i", $data_da_db);
il concatenamento che hai fatto comunque non serve
7. è meglio scrivere require_once "config.php"; //con once e senza parentesi

8. una osservazione: il campo parola lo metti per verificare che chi scrive è umano? se si sarebbe meglio un captcha

9. se nel campo avatar l'utente deve mettere il link es. www.sito_utente.it/suo_avatar.jpg devi verificare che sia un jpg o gif o png
e non qualche altra cosa

intanto questo poi arriveremo all'email
 
La password codificatela in SHA1, ma perché nessuno mi ascolta mai? :p
Comunque, borgoitalia, non ho mai visto in vita mia un'applicazione PHP che non consente di mettere due password. Tanto non ci possono essere due username uguali, quindi... nessun CMS utilizza il sistema che vuoi adottare.
 
ciao
prova ad iscriverti di nuovo al forum con tuo user e pass diversa oppure viceversa.
La password codificatela in SHA1, ma perché nessuno mi ascolta mai?
non l'ho scritta perche io usualmente non la uso, se mi serve criptare una pass utilizzo un mio metodo basato su una chiave numerica
 
Ribadisco, hai detto una stupidaggine. Ho provato a registrarmi con username pincopallino e la stessa password che uso per questo account, e non avevo dubbi sul fatto che mi avrebbe fatto registrare.
Infatti adesso chiedo a qualche moderatore di cancellare l'account pincopallino, in quanto inutile...
Te l'avevo detto che è una cosa assurda e senza senso. Se poi mi fossi registrato con lo stesso username che ho qui è ovvio che mi avrebbe detto che è già occupato, anche nel caso la password fosse diversa.
Se non ci credi prova tu stesso!
 
ho fatto cosi...
che ne pensate....
PHP:
<?php
if(isset($_POST["invia"])){
$error = false;
$nome=$_POST["nome"];
$password=$_POST["password"];
$password2=$_POST["conferma_password"];
$mail=$_POST["mail"];
$avatar=$_POST["avatar"];
$parola=$_POST["parola"];



if($nome == "" OR $nome == "^([A-Za-z0-9])$"){ 
echo("<b>Il campo Nome è vuoto o caratteri non ammessi</b>\n");
$error = true;
}elseif($password == ""){
echo("<b>Il campo Password è vuoto</b>\n");
$error = true;
}elseif($password2 == ""){
echo("<b>Il campo Conferma Password è vuoto</b>\n");
$error = true;
}elseif($password != $password2){
echo("<b>Le password non conicidono</b>\n");
$error = true;
}elseif($mail == "" OR $mail == "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"){
echo("<b>Il campo mail non è corretto</b>\n");
$error = true;
}elseif($parola == ""){
echo("<b>Il campo parola è vuoto</b>\n");
$error = true;
}elseif($parola != "ciao"){
echo("<b>Il campo parola è Sbagliato</b>\n");
$error = true;
}else{
require_once"config.php";

$query1 = mysql_query("SELECT * FROM forum_utenti WHERE nome_utenti = '".$nome."'");
if(mysql_num_rows($query1) != "0"){
echo("<b>Il Nome già esiste</b>\n");
$error = true;
}
$query2 = mysql_query("SELECT * FROM forum_utenti WHERE mail_utenti = '".$mail."'");
if(mysql_num_rows($query2) != "0"){
echo("<b>La mail già esiste</b>\n");
$error = true;
}

if($error == false){
$password=sha1($password);
mysql_query("INSERT INTO `forum_utenti` (
`nome_utenti`, 
`password_utenti`, 
`data_utenti`, 
`mail_utenti`, 
`avatar_utenti`
) VALUES(
'".mysql_real_escape_string(htmlentities($nome))."', 
'".mysql_real_escape_string(htmlentities($password))."', 
'".time()."', 
'".$mail."',
'".mysql_real_escape_string(htmlentities($avatar))."'
);
");
echo "Registrazione avvenuta";
}}}?>
1)il capo parola lo messo per vedere se umano o no si...
2)per avatar e come dici tu
www.sito_utente.it/suo_avatar.jpg
3)la pass la codifico con sha1
va bene cosi....secondo voi....
4)cosa devo cambiare nella tabella di preciso....
scrivetemi voi come deve essere
 
Ultima modifica:
ciao
al posto di
`data_utenti` varchar(255) NOT NULL DEFAULT ' ',
metti
'data_utenti' BIGINT(20) NOT NULL DEFAULT 0,

ho visto che metti

.....$nome == "^([A-Za-z0-9])$") {ecc...

quell'equivalenza è vera se il valore di $nome è ^([A-Za-z0-9])$, falsa in tutti gli altri casi
la verifica si deve fare o con la funzione ereg() o eregi()

per verificare la correttezza

if ($nome == "" OR !eregi("^([A-Za-z0-9])$", $nome)){ecc....

questo vale per tutte le verifiche sul contenito che fai con le espressioni regolari come per $mail

fai la stessa verifica di correttezza sulla password

inoltre, secondo me, per nome_utente e password io metterei una lunghezza minima ed una massima in quanto uno potrebbe mettere un nome =="a" pass=="b"

oppure un nome o pass di 255 caratteri (se conti i carattare dalla c di ciao alla n di con i caratteri sono 255 mi sembrano troppo per un nome o una password)

per l'avatar, come minimo, devi verificare che si tratti di un jpg o gif o png, quindi devi estrarre gli ultimo tre caratteri della stringa immessa con substr()
$tipo_avatar=substr($avatar, -3);

if($tipo_avatar !="jpg" && $tipo_avatar !="gig" && $tipo_avatar !="png"){ echo "formato avatar non ammesso":}



poi dai una letta alle espressioni regolari e valuta cosa mettere, con l'espessione regolare che hai fatto per $nome (ad es) il mio username "borgo italia" non sarebbe accettato

per la codifica aspetta che ti risponda alessandro1997, io non la uso e dovrei guardarmela
 
ho fatto come tu hai detto al inizio per il nome e mail ma dava errore....^^
 
La codifica è apposto, non vedo nessun problema. Basta che ti ricordi di codificare allo stesso modo anche quando l'utente tenta di loggarsi, altrimenti avrai una password codificata ed una no ed è ovvio che non saranno uguali.

L'idea del sistema di prevenzione dei bot come dici tu non mi sembra particolarmente furbo... dopotutto basterebbe che un hacker visitasse personalmente le tue pagine per una volta e poi dicesse al bot di inserire sempre 'ciao' in quel campo. La cosa migliore sarebbe usare un controllo CAPTCHA, cerca su Google.

Il controllo per l'estensione come ha detto borgoitalia non è il massimo, infatti alcuni file hanno estensione jpeg, che è da quattro caratteri. Molti controllano il tipo MIME, ma io la trovo una cosa antica e ho ideato personalmente questo metodo:
PHP:
<?php
function check_extension($file, $allowed)
{
	$ext = explode('.', $file);
	$ext = $ext[count($ext) - 1];

	if(!in_array($ext, $allowed))
		return false;
	return true;
}
?>
Basta passare a questa funzione come primo parametro il nome del file e come secondo parametro un array con tutte le estensioni ammesse, senza il punto.
 

Discussioni simili