はじめに
やっとホームグラウンドの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 バリアント
https://www.php.net/manual/ja/migration72.deprecated.php
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.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); }