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

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回はPHPのメール送信関数と乱数生成関数に関する問題です。mail() や random_bytes()、random_int() などについての理解が問われます。しっかりと押さえておきましょう。
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の解説
誤りです。
選択肢3の解説
正しいです。
random_bytes() 関数は、暗号論的に安全なランダムなバイト列を生成します。その返り値はバイナリ形式であり、bin2hex() や base64_encode() を使って表示可能な形式に変換することができます。説明通りの動作をします。
選択肢4の解説
正解です。random_int() の max 引数には整数を指定しなければならず、PHP_INT_MAX + 1 とすると浮動小数点数となり、選択肢4のようなエラーが出ます。
正解選択肢
以上より選択肢2が正解となります。
他の問題へ
模擬問題(1)インストール
模擬問題(2)変数の型
模擬問題(3)クラス
模擬問題(4)メソッドその1
模擬問題(5)メソッドその2
模擬問題(6)リファレンス
模擬問題(7)名前空間
模擬問題(8)エラー
模擬問題(9)定義済みのインターフェイスとクラスおよび SPL インターフェイス
模擬問題(10)SPL
模擬問題(11)定義済の変数
模擬問題(12)PHP7.0.xからPHP7.1.xへの移行
模擬問題(13)可変変数
模擬問題(14)PHP7.3.xからPHP7.4.xへの移行
模擬問題(15)PHP7.4.xからPHP8.0.xへの移行
模擬問題(16)制御構造
模擬問題(17)XSS(クロスサイトスクリプティング)
模擬問題(18)ファイルアップロード
模擬問題(19)推測困難なトークン
模擬問題(20)セッション
模擬問題(21)PHP のメモリ消費
模擬問題(22)関数その1
模擬問題(23)関数その2
模擬問題(24)関数その3
模擬問題(25)関数その4
模擬問題(26)関数その5
模擬問題(27)関数その6
模擬問題(28)関数その7
模擬問題(29)関数その8
模擬問題(30)関数その9
コメント