Questo file register.php chiama la funzione user_register() del file register_funcs.inc. Quando compilo il modulo rispettando tutti i controlli mi compare sempre lo stesso messaggio:
ERROR-Please fill in all fields correctly
mi aiutate?
Codice PHP:
<?php
/**********************************************************
* Pagina di registrazione di un nuovo utente. Esistono *
* collegamenti a questa pagina nell’intestazione di ogni *
* altra pagina per gli utenti connessi e disconnessi. *
* Potrebbe essere un difetto di progettazione, però; *
* è possibile voler mostrare questa pagina solo ai *
* visitatori che non hanno eseguito l’accesso. *
**********************************************************/
require_once("register_funcs.inc");
// inserisce il file con le funzioni per da richiamare per la registrazione
if ($submit == "Mail confirmation") {
$feedback = user_register();
// In ogni caso viene fornito un feedback
$feedback_str = "<P class=\"errormess\">$feedback</P>";
} else {
// Se non è verificato l'if mostra il modulo per
// la prima volta
$feedback_str = "";
}
// --------------------
// VISUALIZZA IL MODULO
// --------------------
// Le variabili superglobali non funzionano con heredoc
$php_self = $_SERVER["PHP_SELF"];
$reg_str = <<< EOREGSTR
<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 ALIGN=CENTER
WIDTH=621>
<TR>
<TD ROWSPAN=10>[img]../images/spacer.gif[/img]</TD>
<TD WIDTH=606></TD>
</TR>
<TR>
<TD>
// Modulo di registrazione.
$feedback_str
<P CLASS="left">[B]REGISTER[/B]
Fill out this form and a confirmation email will be sent to you.
Once you click on the link in the email your account will be
confirmed and you can begin to contribute to the community.</P>
<FORM ACTION="$php_self" METHOD=”POST”>
<P CLASS="bold">First Name
<INPUT TYPE="TEXT" NAME="first_name" VALUE="$first_name"
SIZE="20" MAXLENGTH="25"></P>
<P CLASS="bold">Last Name
<INPUT TYPE="TEXT" NAME="last_name" VALUE="$last_name" SIZE="20"
MAXLENGTH="25"></P>
<P CLASS="bold">Username
<INPUT TYPE="TEXT" NAME="user_name" VALUE="$user_name" SIZE="10"
MAXLENGTH="25"></P>
<P CLASS="bold">Password
<INPUT TYPE="password" NAME="password1" VALUE="" SIZE="10"
MAXLENGTH="25"></P>
<P CLASS="left">[B]Password[/B] (again)
<INPUT TYPE="password" NAME="password2" VALUE="" SIZE="10"
MAXLENGTH="25"></P>
<P CLASS="left">[B]Email[/B] (required for confirmation)
<INPUT TYPE="TEXT" NAME="email" VALUE="$email" SIZE="30"
MAXLENGTH="50">
</P>
<INPUT TYPE="SUBMIT" NAME="submit"
VALUE="Mail confirmation">
</P>
</FORM>
</TD>
</TR>
</TABLE>
EOREGSTR;
echo $reg_str;
//site_footer();
?>
<?php
// ***************** FILE REGISTER_FUNCS.INc **************************
// Un file con host del database, utente, password
// e database selezionato. Sono i dati per accedere al
// db per la connessione a mysql dell'utente specifico.
include_once("db_vars.inc");
// Una stringa utilizzata per la crittografia md5. È possibile
// spostarla in un file esterno alla struttura Web
// per sicurezza.
$supersecret_hash_padding = "stringa";
function user_register()
{
// Questa funzione opererà solo con array superglobali,
// perché non vengono passati valori o dichiarate
// variabili globali
global $supersecret_hash_padding;
// Tutte le variabili sono presenti?
// Le password corrispondono?
if (strlen($_POST['user_name']) <=25 && strlen($_POST['password1']) <=25 && ($_POST['password1'] == $_POST['password2']) && strlen($_POST['email']) <= 50 && validate_email($_POST['email']))
{
// Convalida nome utente e password
if (account_namevalid($_POST['user_name']) || strlen($_POST['password1'] >= 6))
{
$user_name = strtolower($_POST['user_name']);
$user_name = trim($user_name);
// Toglie gli spazi e rende tutto in minuscolo.
// Non necessita dell’escape, perché le virgolette
// singole non sono consentite
//mette l'email in una varabile.
$email = $_POST['email'];
// Non consente nomi utente o indirizzi di posta
// elettronica duplicati. Si seleziona dal db
// tutti i records user_id( indirizzi ip) con
// email e password insertita.
$query = "SELECT user_id FROM user WHERE (user_name = '$user_name' AND email = '$email' )";
$result = mysql_query($query);
// Cerca nel database se esiste uno user con email e nome
// come quelli specificati questo per evitare duplicati.
if ($result && mysql_num_rows($result) > 0)
{
$feedback = "ERROR-Username or email address already exists";
return $feedback;
// se si preleva un record significa che l'utente è già
// registrato.
} else { // è un nuovo utente e va registrato.
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
// la password viene registrata con MD5
$password = md5($_POST['password1']);
// l'userid è l'indirizzo del pc
$user_ip = $_SERVER['REMOTE_ADDR'];
// Crea un nuovo hash per inserire il database e
// l’e-mail di conferma
$hash = md5($email.$supersecret_hash_padding);
//Inserisce il nuovo record.
$query = "INSERT INTO user (user_name, first_name,
last_name, password, email, remote_addr, confirm_hash,
is_confirmed, date_created)
VALUES ('$user_name', '$first_name', '$last_name',
'$password', '$email', '$user_ip', '$hash', '0',
NOW())";
// is_confirmed è zero perchè non è ancora stato
// confermato via email
$result = mysql_query($query);
if (!$result) {
$feedback = 'ERROR-Database error';
return $feedback;
} else {
// Invia l’e-mail di conferma
$encoded_email = urlencode($_POST['email']);
// La pagina chiamata è confirm.php alla quale si passano i parametri
// per la conferma.
$mail_body = <<< EOMAILBODY
Grazie per esserti registrato. Clicca indirizzo che segue per
confermare la registrazione:
[url]http://www.mysito.com/test/confirm.php?hash=[/url]$hash&email=$encoded_email
Quando vedrai il messaggio di conferma potrai loggarti alla
pagina del download.
EOMAILBODY;
//Invio dell'email con il link ed il messaggio di sopra.
mail ($email, ' Conferma della Registrazione',
$mail_body, 'From: [email]info@mysito.com[/email]');
// Fornisce un messaggio di registrazione riuscita
$feedback = 'REGISTRAZIONE AVVENUTA CON SUCCESSO.
Ricerai una conferma via email al più presto';
return $feedback;
}
}
} else { // si riferisce all'if di convalida nome
// utente e password il secondo della funzione
$feedback = 'ERROR-Username or password is invalid';
return $feedback;
}
} else {
$feedback = 'ERROR-Please fill in all fields correctly';
return $feedback;
}
}
// Questa funzione convalida il nome dell'account. semplici
// controlli prima citati anti-crack
function account_namevalid() {
// Parametro per l’utilizzo con strspan
$span_str = "abcdefghijklmnopqrstuvwxyz" .
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
// Deve contenere almeno un carattere
if (strspn($_POST['user_name'],$span_str) == 0) {
return false;
}
// Deve contenere tutti i caratteri legali
if (strspn($_POST['user_name'],$span_str) != strlen($name)) {
return false;
}
// Lunghezza minima e massima
if (strlen($_POST['user_name']) < 5) {
return false;
}
if (strlen($_POST['user_name']) > 25) {
return false;
}
// Nomi non validi
if (eregi("^((root)|(bin)|(daemon)|(adm)|(lp)|(sync)|(shutdown)|
(halt)|(mail)|(news)|(uucp)|(operator)|(games)|(mysql)|
(httpd)|(nobody)|(dummy)|(www)|(cvs)|(shell)|(ftp)|(irc)|
(debian)|(ns)|(download))$", $_POST['user_name'])) {
return false;
}
if (eregi("^(anoncvs_)", $_POST['user_name'])) {
return false;
}
return true;
}
// controlla che l'email sia valida ed esistente.
function validate_email () {
return (ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $_POST['email']));
}
function user_confirm() {
// Questa funzione opererà solo con array superglobali,
// perché non vengono passati valori o dichiarate
// variabili globali
global $supersecret_hash_padding;
// Verifica che non falsifichino l’indirizzo
// di posta elettronica
$new_hash = md5($_GET['email'].$supersecret_hash_padding);
if ($new_hash && ($new_hash == $_GET['hash']))
{
$query = "SELECT user_name FROM user WHERE confirm_hash = '$new_hash'";
$result = mysql_query($query);
if (!$result || mysql_num_rows($result) < 1)
{
$feedback = 'ERROR-Hash not found';
return $feedback;
} else {
// Conferma l’e-mail e attiva l’account mettendo la variabile ora ad 1.
$email = $_GET['email'];
$hash = $_GET['hash'];
$query = "UPDATE user SET email='$email',
is_confirmed='1' WHERE confirm_hash='$hash'";
$result = mysql_query($query);
return 1;
}
} else {
$feedback = 'ERROR-Values do not match';
return $feedback;
}
}
?>