2段階認証のプラグイン「Two-Factor-Authentication」を有効化すると下記のような警告が発生しました。
==========================================================
Deprecated: Function mcrypt_get_iv_size() is deprecated in /usr/local/shigi/shigizemi/wp/wp-content/plugins/two-factor-authentication/includes/class-simba-tfa.php on line 510
Deprecated: Function mcrypt_create_iv() is deprecated in /usr/local/shigi/shigizemi/wp/wp-content/plugins/two-factor-authentication/includes/class-simba-tfa.php on line 519
Deprecated: Function mcrypt_decrypt() is deprecated in /usr/local/shigi/shigizemi/wp/wp-content/plugins/two-factor-authentication/includes/class-simba-tfa.php on line 539
===========================================================
「Deprecated: Function mcrypt_decrypt() is deprecated」でGoogle先生にお尋ねしました。
すると、「mcrypt_xxxxx」は、php7.1で非推奨、php7.2から廃止になったということです。
サーバにイントールされているphpのバージョンは7.2です。
# php -v
PHP 7.2.13 ....中略....
しょうがないので、対策です。「mcrypt_xxxx」の代わりに「openssl」を使うことが可能なようです。
幸い、サーバにはopensslがインストールしてあるので、問題の「class-simba-tfa.php」のスクリプトだけを変更することにしました。
# openssl version
OpenSSL 1.xxxxxxxxxxxxxxxxxxx
では、さっそく回避策を初めます。
【前提条件】
- WordPressのサーバには、すでにopensslがインストールされている。
- サーバにphp7.2がインストールされている。
- php7.1まで、対策されているので、しばらく待っていれば、7.2対策済みにUpdateされるはず。
<手順>
- class-simba-tfa.php の該当行を改修する。
1.class-simba-tfa.php の該当行を改修する。
(1) line 510 (510行目)を改修。
スクリプトをよく眺めてみると、510行目でphp7.1までは、対策がしてあるようです。
php7.2以上なら「elseif」へ飛ぶようにすれば、opensslが使えそうですね。
private function get_iv_size() {
// mcrypt first, for backwards compatibility
if (function_exists('mcrypt_get_iv_size')) {
return $this->is_php_71 ? @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC) : mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
} elseif (function_exists('openssl_cipher_iv_length')) {
return openssl_cipher_iv_length('AES-128-CBC');
}
throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed');
}
「phpversion() 」で、現在のphpのバージョン番号を取得できます。
509行目の分岐条件に、「phpversion() < ‘7.2.0’」を追記して、「phpのバージョンが、7.2.0より小さくて、かつ、mcrypt_get_iv_size が存在すれば、真」として、今までどおりすぐ下の return $this->is_php_71 ? の行を実行します。
そうでなければ(php7.2以上ならば)elseifの行へ行き、opensslがインストールされていればそれを利用します。
下記(511行目)のように改修しました。
private function get_iv_size() {
// mcrypt first, for backwards compatibility
//改修php7.2用 2019-01-13 19:48:27
//if (function_exists('mcrypt_get_iv_size')) {
if (phpversion() < '7.2.0' && function_exists('mcrypt_get_iv_size')) {
return $this->is_php_71 ? @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC) : mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
} elseif (function_exists('openssl_cipher_iv_length')) {
return openssl_cipher_iv_length('AES-128-CBC');
}
throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed');
}
この改修により、519行目に表示されていたエラーも消えたので、519行目はとくに対策をしていません。そのままにしています。なお519行目は、改修後には行送りされて521行目(マークされた行)になっています。
private function create_iv($iv_size) {
if (function_exists('mcrypt_create_iv')) {
return $this->is_php_71 ? @mcrypt_create_iv($iv_size, MCRYPT_RAND) : mcrypt_create_iv($iv_size, MCRYPT_RAND);
} elseif (function_exists('openssl_random_pseudo_bytes')) {
return openssl_random_pseudo_bytes($iv_size);
}
throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed');
}
(2) line 539 (539行目)を改修。
次は、539行目です。2行送られているので、実際は541行目となります。上記と同様に542行目に回避策を施しました。
private function decrypt($key, $enc, $iv, $force_openssl = false) {
// Prefer mcrypt, because it can decrypt the output of both mcrypt_encrypt() and openssl_decrypt(), whereas (because of mcrypt_encrypt() using bad padding), the converse is not true
//改修php7.2用 2019-01-13 19:48:27
//if (function_exists('mcrypt_decrypt') && !$force_openssl) {
if (phpversion() < '7.2.0' && function_exists('mcrypt_decrypt') && !$force_openssl) {
return $this->is_php_71 ? @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv) : mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv);
} elseif (function_exists('openssl_decrypt')) {
$decrypted = openssl_decrypt($enc, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (false === $decrypted && !$force_openssl) { error_log("TFA decryption failure: was your site migrated to a server without mcrypt? You may need to install mcrypt, or disable TFA, in order to successfully decrypt data that was previously encrypted with mcrypt."); }
return $decrypted;
}
if ($force_openssl) return false;
throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed');
}
一応、これで、エラー表示は消えました。
おそらく、もうしばらく待てばphp7.2対策が施されたものがUpdateされるはずです。それを待ってもよいかも。