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

では、さっそく回避策を初めます。

【前提条件】

  1. WordPressのサーバには、すでにopensslがインストールされている。
  2. サーバにphp7.2がインストールされている。
  3. php7.1まで、対策されているので、しばらく待っていれば、7.2対策済みにUpdateされるはず。

<手順>

  1. 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されるはずです。それを待ってもよいかも。