
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第23回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
関数 に関する説明の中で、誤っているものを1つ選びなさい。
なお「\」はバックスラッシュに読み替えること。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。
mail ( string $to , string $subject , string $message , array|string $additional_headers = [] , string $additional_params = “” ) : bool
random_bytes ( int $length ) : string
random_int ( int $min , int $max ) : int
(1)
mail() 関数は、メールを送る事ができる。
subject と message (本文) に日本語などを用いる場合は、例えば subject であれば RFC 2047 の仕様を満たす必要があるため、適切な処理が必要になる。
その場合は mb_send_mail() 関数を使う事で、ヘッダと本文が mb_language() の設定に基づき変換、エンコードされる。
そのため、以下のコード
$r = mb_send_mail('php-exam@example.com', '日本語タイトル', 'mail本文');
var_dump($r);
を実行すると
bool(true)
となり、同時にメールが送られる。
送られたメールの本文とそれに関連するヘッダは次のとおりとなる。
Subject: 日本語タイトル
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: BASE64
bWFpbOacrOaWhw==
(2)
mail() 関数は、メールを送る事ができる。
第四引数の additional_headers には「追加のヘッダ」の情報が入る。
そのため、以下のコード
$external_value = "test \r\ninjection_header: hoge"; // 外部からのデータを仮定
// additional_headersの組み立て
$headers = [];
$headers[] = "X-test: test";
$headers[] = "X-test2: {$external_value}";
$r = mail('php-exam@example.com', 'subject', 'mail body', implode("\r\n", $headers));
var_dump($r);
を実行すると、結果は次のとおりとなる。
bool(true)
となり、同時にメールが送られる。
送られたメールの本文とそれに関連するヘッダは次のとおりとなる。
X-test: test
X-test2: test injection_header: hoge
(3)
random_bytes() 関数は、暗号論的に安全な、疑似ランダムなバイト列を生成する事ができる。
この関数が返す値はバイナリであるため、使う場合には bin2hex() 関数や base64_encode() 関数を合わせて使う事が多い。
そのため、以下のコード
$s = random_bytes(16);
var_dump( bin2hex($s) );
var_dump( base64_encode($s) );
を実行すると、結果は次のような表記となる。(乱数の値は実行毎に変わる)
string(32) "9338779e0f8a377bcac56f0b7e299a03"
string(24) "kzh3ng+KN3vKxW8LfimaAw=="
(4)
random_int() 関数は、暗号論的に安全な、疑似ランダムな整数を生成する事ができる。
min は PHP_INT_MIN 以上、max は PHP_INT_MAX 以下である必要がある。
そのため、以下のコード
random_int(PHP_INT_MIN, PHP_INT_MAX + 1);
を実行すると、結果は次のとおりとなる。
Fatal error: Uncaught TypeError: random_int(): Argument #2 ($max) must be of type int, float given in …
解説
選択肢1の解説
正しいです。
mb_send_mail() 関数は、日本語などを含むメールを送るために使用されます。mb_send_mail() は、メールのタイトルや本文を適切にエンコードし、RFC 2047 に準拠した形式でメールを送信します。説明通りの動作をします。
選択肢2の解説
正しいです。
mail() 関数は、追加のヘッダを含めてメールを送信できます。additional_headers には複数のヘッダ情報を追加することができ、外部からのデータをヘッダに挿入する場合には注意が必要です。説明通りの動作をします。
選択肢3の解説
正しいです。
random_bytes() 関数は、暗号論的に安全なランダムなバイト列を生成します。その返り値はバイナリ形式であり、bin2hex() や base64_encode() を使って表示可能な形式に変換することができます。説明通りの動作をします。
選択肢4の解説
誤りです。random_int() の max 引数には整数を指定しなければならず、PHP_INT_MAX + 1 は無効な値であるため、エラーが発生します。
正解選択肢
以上より選択肢4が正解となります。
コメント