From 98682c7a8792e7e79e487fea5024d25cee5aa310 Mon Sep 17 00:00:00 2001
From: nsfisis contained unnecessary whitespaces inside it
---
.../phperkaigi-2023-unused-token-quiz-1/index.html | 52 +++++++---------------
1 file changed, 17 insertions(+), 35 deletions(-)
(limited to 'public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1')
diff --git a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
index a2bf44c..db0e7b6 100644
--- a/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
+++ b/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html
@@ -68,8 +68,7 @@
注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。
- <?php
+ <?php
$π = $argv[1] ?? null;
if ($π === null) {
@@ -89,8 +88,7 @@ if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
echo "Token: {$t}\n";
} else {
echo "Failed.\n";
-}
-
+}
$argv[1]を参照している。それを$πなる変数に代入しているので、円周率を渡してみる。
-
- $ php Q.php 3.14
- Failed.
-
+ $ php Q.php 3.14
+ Failed.
失敗してしまった。精度を上げてみる。
-
- $ php Q.php 3.1415
-Failed.
-
+ $ php Q.php 3.1415
+Failed.
だめだった。これを成功するまで繰り返す。 @@ -121,10 +115,8 @@ Failed. 最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。
-
- $ php Q.php 3.1415926535897932
-Token: #YO
-
+ $ php Q.php 3.1415926535897932
+Token: #YO
めでたくトークン「#YO」が手に入った。 @@ -137,24 +129,20 @@ Token: #YO 短いので頭から追っていく。
-
- $π = $argv[1] ?? null;
+ $π = $argv[1] ?? null;
if ($π === null) {
exit('No input.');
}
$π = trim($π);
if (!is_numeric($π)) {
exit('Invalid input.');
- }
-
+ }
入力のバリデーション部分。数値のみ受け付ける。
-
- $s = implode(array_map(chr(...), str_split($π, 2)));
-
+ $s = implode(array_map(chr(...), str_split($π, 2)));
$πを 2 文字ごとに区切り (str_split)、数値を ASCII コードと見做して文字に変換 (chr) して結合 (implode) している。
@@ -164,17 +152,13 @@ Token: #YO
例えば、$πが'656667'だったとすると、65、66、67に対応した'A'、'B'、'C'へと変換され、'ABC'になる。
- $π = '656667';
+ $π = '656667';
$s = implode(array_map(chr(...), str_split($π, 2)));
echo $s;
-// => ABC
-
+// => ABC
-
- preg_match('/(\x23.+?) /', $s, $m);
-$t = $m[1] ?? '';
-
+ preg_match('/(\x23.+?) /', $s, $m);
+$t = $m[1] ?? '';
正規表現でマッチングしている。\x23は#と同じであることに留意すると、この正規表現は「#から始まる 2 以上の長さ (含#) の文字列で、最初に現れるスペースまで」にマッチする。つまりこれは、PHPerKaigi におけるトークンである。
@@ -184,13 +168,11 @@ $t = $m[1] ?? '';
なお、#を直接書いていないのは、/#.+?) /と書くと、#.+?)という意図せぬトークンが登録されてしまうからである。
- if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+ if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
echo "Token: {$t}\n";
} else {
echo "Failed.\n";
-}
-
+}
最後にトークンのハッシュ値を見て、想定解かどうかを確認する。 -- cgit v1.2.3-70-g09d2