I've been working on a registration form page in jQuery Mobile and I think I'm starting to get it fully complete.
What I need feedback on is if I've forgotten anything in terms of accessibility, security (am I open to any SQL injections or other risks?) and just anything in general. It's my first time creating a proper registration form like this so surely there must be things to improve. The labels are in Swedish but you can see the translation in the $validation
echo.
I would also like some feedback on my PHP validation because it doesn't feel very dry at all with all the if
statements. Perhaps you can combine them in some clever way?
Form markup:
<form id="register-form" method="post"
action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div id="register-inputs-wrapper">
<label for="fname" class="bold">Förnamn:<span class="warning-text"><?php
if(isset($validation['firstname'])) {
echo $validation['firstname'];
}
?></span>
</label>
<input type="text" name="fname" id="fname" value="<?php echo $firstname; ?>"
placeholder="Förnamn" alt="Skriv ditt förnamn" data-clear-btn="true">
<label for="lname" class="bold">Efternamn:<span class="warning-text"><?php
if(isset($validation['lastname'])) {
echo $validation['lastname'];
}?></span>
</label>
<input type="text" name="lname" id="lname" value="<?php echo $lastname; ?>"
placeholder="Efternamn" alt="Skriv ditt efternamn" data-clear-btn="true">
<label for="street-address" class="bold">Gatuaddress:<span class="warning-text"><?php
if(isset($validation['address'])) {
echo $validation['address'];
}?></span>
</label>
<input type="text" name="address" id="street-address"
value="<?php echo $address; ?>" placeholder="T.ex. Kungsgatan 40"
alt="Skriv din gatuaddress" data-clear-btn="true">
<label for="postal-code" class="bold">Postnummer:<span class="warning-text"><?php
if(isset($validation['postal-code'])) {
echo $validation['postal-code'];
}?></span>
</label>
<input type="text" name="postal-code" id="postal-code"
value="<?php echo $postal_code; ?>" placeholder="T.ex. 333 33"
alt="Skriv ditt postnummer" data-clear-btn="true">
<label for="city" class="bold">Stad/ort:<span class="warning-text"><?php
if(isset($validation['city'])) {
echo $validation['city'];
}?></span>
</label>
<input type="text" name="city" id="city" value="<?php echo $city; ?>"
placeholder="Stad/ort" alt="Skriv din stad eller ort"
data-clear-btn="true">
<label for="education" class="bold">Utbildning:<span class="warning-text"><?php
if(isset($validation['education'])) {
echo $validation['education'];
}?></span>
</label>
<select name="education" id="education" alt="Välj utbildning i listan"
data-wrapper-class="ui-btn ui-btn-inline">
<option value="Cobolutvecklare">Cobolutvecklare</option>
<option value="Programvarutestare">Programvarutestare</option>
<option value="Projektledare">Projektledare</option>
<option value="Webbutvecklare">Webbutvecklare</option>
<option value="Webbutvecklare">Ingen (admin, lärare)</option>
</select>
<label for="user-code" class="bold">Behörighetskod:<span class="warning-text"><?php
if(isset($validation['usertype'])) {
echo $validation['usertype'];
}?></span>
</label>
<input type="password" name="user-code" id="user-code"
value="<?php echo $usertype; ?>" placeholder="4 siffror (XXXX)"
alt="Skriv din behörighetskod" data-clear-btn="true">
<label for="email" class="bold">Email:<span class="warning-text"><?php
if(isset($validation['email'])) {
echo $validation['email'];
}
if (isset($validation['existing-user'])) {
echo $validation['existing-user'];
}
?></span>
</label>
<input type="email" name="email" id="email" value="<?php echo $email; ?>"
placeholder="[email protected]" alt="Skriv din e-post address"
data-clear-btn="true">
<label for="pw" class="bold">Lösenord:<span class="warning-text"><?php
if(isset($validation['password'])) {
echo $validation['password'];
}
?></span>
</label>
<input type="password" name="password" id="pw" value="<?php echo $password; ?>"
placeholder="T.ex. Jensenonline038"
alt="Skriv ett lösenord" data-clear-btn="true">
<label for="conf-pw" class="bold ui-btn-inline">Bekräfta lösenord:<span class="warning-text left"><?php
if(isset($validation['conf_password'])) {
echo $validation['conf_password'];
}
?></span>
</label>
<input type="password" name="confirm-password" id="conf-pw"
value="<?php echo $confirmed_password; ?>"
placeholder="Bekräfta lösenordet" alt="Bekräfta lösenordet"
data-clear-btn="true">
</div>
</form>
<div class="center-text">
<input type="submit" form="register-form" name="submit_reg" value="Registrera"
alt="Slutför registrering" data-icon="check" data-iconpos="right"
data-inline="true" data-wrapper-class="space-upper" id="reg-submit">
<div>
<a href="#landing-page" class="ui-btn ui-btn-inline ui-corner-all ui-shadow ui-btn-icon-left ui-icon-arrow-l space-top">Gå tillbaks</a>
</div>
</div>
PHP validation code:
function validate_registration($firstname, $lastname, $address, $postal_code, $city, $usertype, $email, $password, $confirmed_password) {
//Tell the server that we're accessing the global $db variable
global $db;
//Clear the previous errors to ensure
//that the correct error messages is being displayed
$fnameErr = $lnameErr = $addressErr = $postal_codeErr = $cityErr = $usertypeErr = $emailErr = $pwErr = $conf_pwErr = $ex_emailErr = '';
//Remove any excess whitespace
$firstname = trim($firstname);
$lastname = trim($lastname);
$address = trim($address);
$postal_code = trim($postal_code);
$city = trim($city);
$usertype = trim($usertype);
$email = trim($email);
$password = trim($password);
$confirmed_password = trim($confirmed_password);
//Check that the input values are of the proper format
if (!preg_match('/^[A-Za-zéåäöÅÄÖ\s\ ]*$/', $firstname)) {
$fnameErr = 'Förnamnet kan endast innehålla bokstäver (é, a-ö) och mellanslag';
}
if (!preg_match('/^[A-Za-zéåäöÅÄÖ\s\ ]*$/', $lastname)) {
$lnameErr = 'Efternamnet kan endast innehålla bokstäver (é, a-ö) och mellanslag';
}
if (!preg_match('/^[A-Za-z0-9éåäöÅÄÖ\s\ ]*$/', $address)) {
$addressErr = 'Addressen kan endast innehålla bokstäver (é, a-ö), siffror och mellanslag';
}
if (!preg_match('/^(se-|SE-){0,1}[0-9]{3}\s?(| |-)[0-9]{2}$/', $postal_code)) {
$postal_codeErr = 'Ogiltigt format)';
}
if (!preg_match('/^[A-Za-zéåäöÅÄÖ\s\ ]*$/', $city)) {
$cityErr = 'Endast bokstäver är tillåtna (é, a-ö)';
}
if (!preg_match('/^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$/', $password)) {
$pwErr = 'Minst 8 tecken, en versal och en siffra';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = 'Ogiltig e-post address';
}
if (empty($firstname)) {
$fnameErr = 'Du måste ange ditt förnamn';
}
if (empty($lastname)) {
$lnameErr = 'Du måste ange ditt efternamn';
}
if (empty($address)) {
$addressErr = 'Du måste ange en address';
}
if (empty($city)) {
$cityErr = 'Du måste ange din stad eller ort';
}
if (empty($email)) {
$emailErr = 'Du måste ange en e-post address';
}
if (empty($password)) {
$pwErr = 'Du måste ange ett lösenord';
}
if (empty($confirmed_password)) {
$conf_pwErr = 'Du måste bekräfta lösenordet';
}
if ($confirmed_password != $password && !empty($confirmed_password)) {
$conf_pwErr = 'Lösenorden matchar inte';
}
try {
$query = 'SELECT * FROM usertypes';
$prepared_stmt = $db->prepare($query);
$prepared_stmt->execute();
$valid_codes = $prepared_stmt->fetch(PDO::FETCH_ASSOC);
if ($valid_codes['admin'] === $usertype) {
$usertype = 'Admin';
}
else if ($valid_codes['teacher'] === $usertype) {
$usertype = 'Teacher';
}
else if ($valid_codes['student'] === $usertype) {
$usertype = 'Student';
}
else {
$usertypeErr = 'Ogiltig behörighetskod';
}
if (empty($usertype)) {
$usertypeErr = 'Du måste ange en behörighetskod';
}
else if (!ctype_digit($usertype)) {
$usertypeErr = 'Endast siffror tillåtet';
}
else if (strlen($usertype) > 4) {
$usertypeErr = 'Koden är för lång';
}
else if (strlen($usertype) < 4) {
$usertypeErr = 'Koden är för kort';
}
}
catch (Exception $e) {
echo $e;
}
try {
$query = 'SELECT * FROM useraccounts ';
$query .= 'WHERE email = :email';
$prepared_stmt = $db->prepare($query);
$prepared_stmt->bindParam(':email', $email);
$prepared_stmt->execute();
$user_exists = $prepared_stmt->fetch();
if($user_exists){
$ex_emailErr = 'Den angivna e-post addressen existerar redan, vänligen ange en annan giltig e-post address';
}
} catch (Exception $e){
echo $e;
}
if (empty($fnameErr) &&
empty($lnameErr) &&
empty($addressErr) &&
empty($postal_codeErr) &&
empty($cityErr) &&
empty($usertypeErr) &&
empty($emailErr) &&
empty($pwErr) &&
empty($conf_pwErr)) {
return array(
'state' => true,
'usertype_text' => $usertype
);
}
else {
return array(
'firstname' => $fnameErr,
'lastname' => $lnameErr,
'address' => $addressErr,
'postal-code' => $postal_codeErr,
'city' => $cityErr,
'usertype' => $usertypeErr,
'email' => $emailErr,
'password' => $pwErr,
'conf_password' => $conf_pwErr,
'existing-user' => $ex_emailErr
);
}
}