私が支援を求められたいくつかのv2.5.7サイトに大きな問題があるようです。標準のcontact-usフォームの組み込みcom_contactコンポーネントに入力されたときに電子メールが検証されません。
送信者が使用するTLDがドメイン名の「ドット」の最後に4文字を超える値を使用すると、お問い合わせフォームはエラーになります...つまり、「。cloudの5文字」 'は受け入れられませんが、' 。com 'としての3文字は期待どおりに機能します。これは、メールアドレスで新規/拡張ドメイン名を使用するときに送信されるすべてのフォームで再現可能な問題であることを確認しました。それ以外の場合、フォームはすべて完全に機能します。
このサイトはまだ新しいものにアップグレードされず、コアコードはバグとセキュリティ問題をカバーするために大幅にパッチされています。そのため、これに対する修正に対応するために別のパッチが必要になります。つまり、手でコーディングするしかありません。
これまでに明らかにしたことから、電子メールアドレス自体を担当する検証コードは/libraries/joomla/form/rules/email.phpにあります。
検証を行うコードは、行#27の正規表現のようです...そして私は嫌いで、確実な修正を提供できるように正規表現について十分に理解していません。
私の仮定が正しいかどうか、これが問題のコードであるか、またはこれが適切なファイルではない場合にどこにあるかについて、よく知っている人がポインタを教えてもらえますか?そして、それが正しい場所である場合、より長いTLDが電子メールアドレスで受け入れられるようにするために、どのような変更を加えることができますか。
Email.phpの関数コード全体は次のとおりです。
class JFormRuleEmail extends JFormRule
{
/**
* The regular expression to use in testing a form field value.
*
* @var string
* @since 11.1
*/
protected $regex = '^[\w.-]+(\+[\w.-]+)*@\w+[\w.-]*?\.\w{2,4}$';
/**
* Method to test the email address and optionally check for uniqueness.
*
* @param JXMLElement &$element The JXMLElement object representing the <field /> tag for the form field object.
* @param mixed $value The form field value to validate.
* @param string $group The field name group control value. This acts as as an array container for the field.
* For example if the field has name="foo" and the group value is set to "bar" then the
* full field name would end up being "bar[foo]".
* @param JRegistry &$input An optional JRegistry object with the entire data set to validate against the entire form.
* @param object &$form The form object for which the field is being tested.
*
* @return boolean True if the value is valid, false otherwise.
*
* @since 11.1
* @throws JException on invalid rule.
*/
public function test(&$element, $value, $group = null, &$input = null, &$form = null)
{
// If the field is empty and not required, the field is valid.
$required = ((string) $element['required'] == 'true' || (string) $element['required'] == 'required');
if (!$required && empty($value))
{
return true;
}
// Test the value against the regular expression.
if (!parent::test($element, $value, $group, $input, $form))
{
return false;
}
// Check if we should test for uniqueness.
$unique = ((string) $element['unique'] == 'true' || (string) $element['unique'] == 'unique');
if ($unique)
{
// Get the database object and a new query object.
$db = JFactory::getDBO();
$query = $db->getQuery(true);
// Build the query.
$query->select('COUNT(*)');
$query->from('#__users');
$query->where('email = ' . $db->quote($value));
// Get the extra field check attribute.
$userId = ($form instanceof JForm) ? $form->getValue('id') : '';
$query->where($db->quoteName('id') . ' <> ' . (int) $userId);
// Set and query the database.
$db->setQuery($query);
$duplicate = (bool) $db->loadResult();
// Check for a database error.
if ($db->getErrorNum())
{
JError::raiseWarning(500, $db->getErrorMsg());
}
if ($duplicate)
{
return false;
}
}
return true;
}
}
問題を正しく特定しました。バグはここで発生しました: https://developer.joomla.org/joomlacode-archive/issue-28128.html
Joomlaは次の正規表現を使用するようになりました。
protected $regex = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$";
おそらく正規表現の行を交換することもできますが、実際にはサイトにパッチを適用し、コアコードには触れないでください。 2.5以降、大量のセキュリティパッチが適用されているため、サイトは脆弱です。