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

研究
Pixabay at Pexels
この記事は約6分で読めます。

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

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

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

PHP: PHP 7.2.x で推奨されなくなる機能 – Manual

An empty Codeblock in PHP 7.2.0 will put out an “Unquoted strings” warning. To prevent that, add at least one empty space into the codeblock. Example: ?> Gives: PHP Warning: Use of undefined constant php – assumed ‘php’ (this will throw an Error in a future version of PHP) Fix via: ?> Don’t know if that is an intentional behaviour or a side effect.

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を参照

idn_to_ascii

The notes on this function are not very clear and a little misleading. Firstly, =5.4 you will not require the PECL extensions. Third, use of utf8_encode() is not necessary. In fact, it will potentially prevent idn_to_ascii() from working at all.

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

コメント

タイトルとURLをコピーしました