mayaの実験場

この人生は沼だらけ

INTL_IDNA_VARIANT_2003がdeprecatedしたので対策

f:id:xx_maya_xx:20191126141059p:plain

やっとホームグラウンドのLAMPに戻って来ました。そしたら

Severity: 8192 --> idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated /system/libraries/Email.php 1856

まあCIのバージョンが少し古かったんですが、PHP本家を参照するとこのような話でした。

https://www.php.net/manual/ja/migration72.deprecated.phpwww.php.net

INTL_IDNA_VARIANT_2003 バリアント
Intl 拡張モジュール では、INTL_IDNA_VARIANT_2003 バリアントは非推奨になりました。 これは idn_to_ascii() および idn_to_utf8() 関数の デフォルト値として現在使われています。PHP 7.4 ではこのデフォルト値が INTL_IDNA_VARIANT_UTS46 に変更される予定ですし、 PHP の次のメジャーバージョンアップでは、 INTL_IDNA_VARIANT_2003 が削除される予定です。

とのことなので、デフォルト値なら明示的に変更すればいいじゃない。関数のusageを参照

https://www.php.net/manual/ja/function.idn-to-ascii.phpwww.php.net

idn_to_ascii ( string $domain [, int $options = 0 [, int $variant = INTL_IDNA_VARIANT_2003 [, array &$idna_info ]]] ) : string


variant
IDNA 2003 の場合は INTL_IDNA_VARIANT_2003、あるいは UTS #46 の場合は INTL_IDNA_VARIANT_UTS46。

これで該当箇所を補います。

/system/libraries/Email.php *バージョンにより厳密な行番号が異なる場合があるので行番号は割愛

/**
 * Email Validation
 *
 * @param   string
 * @return  bool
 */
public function valid_email($email)
{
    if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@'))
    {
        $email = self::substr($email, 0, ++$atpos).idn_to_ascii(self::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46);
    }

    return (bool) filter_var($email, FILTER_VALIDATE_EMAIL);
}
/**
 * Validate email for shell
 *
 * Applies stricter, shell-safe validation to email addresses.
 * Introduced to prevent RCE via sendmail's -f option.
 *
 * @see https://github.com/bcit-ci/CodeIgniter/issues/4963
 * @see https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36
 * @license https://creativecommons.org/publicdomain/zero/1.0/  CC0 1.0, Public Domain
 *
 * Credits for the base concept go to Paul Buonopane <paul@namepros.com>
 *
 * @param   string  $email
 * @return  bool
 */

protected function _validate_email_for_shell(&$email)
{
    if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@'))
    {
        $email = self::substr($email, 0, ++$atpos).idn_to_ascii(self::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46);
    }

    return (filter_var($email, FILTER_VALIDATE_EMAIL) === $email && preg_match('#\A[a-z0-9._+-]+@[a-z0-9.-]{1,253}\z#i', $email));
}

/system/libraries/Form_validation.php

/**
 * Valid Email
 *
 * @param   string
 * @return  bool
 */
public function valid_email($str)
{
    if (function_exists('idn_to_ascii') && preg_match('#\A([^@]+)@(.+)\z#', $str, $matches))
    {
        $str = $matches[1].'@'.idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46);
    }

    return (bool) filter_var($str, FILTER_VALIDATE_EMAIL);
}