View Issue Details

IDProjectCategoryView StatusLast Update
0005290Composr alpha bug reports[All Projects] General / Uncategorisedpublic2023-02-22 00:10
ReporterChris GrahamAssigned ToPatrick Schmalstig 
SeverityMinor-bug 
Status resolvedResolutionfixed 
Summary0005290: Fix missing email address validation
DescriptionOn a normal site, an invalid email address slipping through won't be too much of a problem. It will be passed to the outbound email server without much in terms of checks and that will generate an error to the server admin in some form.

However, on a site using a direct SMTP connection, an invalid email address can get stuck in the queue. Composr can't (and I'd say shouldn't) try and distinguish between situations where the SMTP server it is connecting to is down and when the SMTP server is refusing an email.

So we need to validate email addresses better so that this does not happen.

Here are two templates that should use type="email" for automatic frontend validation...

./themes/default/templates/COMMENTS_POSTING_FORM.tpl:86: <input aria-errormessage="error-email-msg" id="email" name="email" value="{$MEMBER_EMAIL*}" type="text" tabindex="2" maxlength="255" class="form-control form-control-wide{+START,IF,{$NOT,{EMAIL_OPTIONAL}}} input-text-required{+END}" />
./themes/default/templates/INSTALLER_STEP_2.tpl:15: <input maxlength="255" class="form-control form-control-wide" id="email" name="email" type="text" placeholder="{!EMAIL_ADDRESS_FOR_NEWSLETTER}" size="25" />

Here are cases in the code where we are not doing back-end validation...

./pages/modules/recommend.php:548: $recommender_email_address = post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER);
./site/pages/modules_custom/sites.php:485: $email_address = post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER);
./site/pages/modules/tickets.php:921: $email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./adminzone/pages/modules/admin_cns_members.php:337: $email_address = post_param_string('email', member_field_is_required(null, 'email_address') ? false : '', INPUT_FILTER_POST_IDENTIFIER);
./sources/blocks/main_join.php:128: $email_address = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./sources/feedback.php:868: $email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./sources/report_content.php:333: $email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./sources/report_content.php:390: $email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./sources/report_content.php:420: $email = post_param_string('email', $GLOBALS['FORUM_DRIVER']->get_member_email_address($member_id), INPUT_FILTER_POST_IDENTIFIER);
./sources/cns_install.php:977: post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER), // email_address
./sources/mail_forms.php:166: $from_email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./install.php:2097: $email = post_param_string('email', '', INPUT_FILTER_POST_IDENTIFIER);
./sources_custom/cns_join.php:97: 'i_email_address' => post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER),
./sources_custom/cns_join.php:103: 'i_email_address' => post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER),
./sources_custom/hooks/endpoints/misc/contact_us.php:43: $email_from = post_param_string('email', $GLOBALS['FORUM_DRIVER']->get_member_email_address(get_member()), INPUT_FILTER_POST_IDENTIFIER);

Back-end validation looks something like...

require_code('type_sanitisation');
if ($email != '' && !is_valid_email_address($email)) {
   warn_exit(do_lang_tempcode('INVALID_EMAIL_ADDRESS'));
}

Also I noticed a bug...

// Check e-mail domain, if applicable
$email_address = post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER);

This code in cns_join.php is overwriting $email_address. The "$email_address = post_param_string('email', false, INPUT_FILTER_POST_IDENTIFIER);" line should be gone.
TagsNo tags attached.
Sponsorship open

Activities

Patrick Schmalstig

2023-02-22 00:09

administrator   ~0007958

Already using email address validation: ./pages/modules/recommend.php (it's further down the code)

feedback.php was only using email for a comcode tag, so instead of warn_exit, I simply made it not use the email comcode tag if the email is invalid.

For all other backend cases, to avoid lots of repeating code, I added a new INPUT_FILTER_EMAIL_ADDRESS bitmask which can be used on post_param_string for email addresses.

Issue History

Date Modified Username Field Change
2023-02-18 16:18 Chris Graham New Issue
2023-02-18 16:18 Chris Graham Status non-assigned => assigned
2023-02-18 16:18 Chris Graham Assigned To => Patrick Schmalstig
2023-02-22 00:09 Patrick Schmalstig Note Added: 0007958
2023-02-22 00:10 Patrick Schmalstig Status assigned => resolved
2023-02-22 00:10 Patrick Schmalstig Resolution open => fixed
2023-02-26 18:29 Chris Graham Category General => General / Uncategorised