【CodeIgniter3】INTL_IDNA_VARIANT_2003がdeprecatedしたので対策

投稿者:

はじめに

やっとホームグラウンドの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.php

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 が削除される予定です。

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

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

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

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

*バージョンにより厳密な行番号が異なる場合があるのでfunction名で補完してください

/**
* 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);
}

コメントを残す