自分のWordPressで学ぶPHP講座(AIの変更を判定する)
区分5 判定の型★★★AIの変更を見るたびに、ゼロから考えていると疲れますし、見落とします。 そこで、毎回同じ5つの問いを同じ順で当てます。
たとえ話にします。 飛行機のパイロットは、慣れていても毎回チェックリストを読み上げます。腕の問題ではなく、忘れないための仕組みだからです。
差分(diff)は、変更の前と後を比べて、足した行と消した行を示した物です。 No.06 で見たように、足した行は+、消した行は-で読みます。
判定する対象は、AIが「やりました」と言った文章ではなく、差分そのものです。
| 問い | 見ること | 該当する単元 |
|---|---|---|
| 1 どのファイルの、いつ動く所か | 場所と、動く時機(毎回か、特定のページだけか) | No.01、02、05 |
| 2 外から来る値は、どこで、消毒(sanitize)されているか | 訪問者が送れる値(URL の ? 以降、フォームなど)を使っていないか | No.07 |
| 3 画面に出す値は、エスケープ(escape)されているか | 画面に出る前に、無害な形に変えているか | No.07 |
| 4 控えと戻し方はあるか。下見したか | 変更前の控え、戻す手順、本番の前の確認 | No.06、09 |
| 5 全員に効くのか、一部の人だけか | 影響の範囲。意図と合っているか | No.05、06 |
覚える順は、そのまま問いの番号で構いません。 5つのどれかに答えられなければ、その時点でOKは出さず、AIに聞き返します。
問い1は「どこの、いつ」です。 functions.php に足された処理が、全ページで毎回動くのか、フックを使って特定の場面だけ動くのかを読みます。
問い5は、その結果が「誰に効くか」です。 全員に出るはずの変更が、一部の人だけだったり、一部の人だけのはずの変更が、全員に出ていたりするのが、よくある事故です。
この2つは、AIの説明と、実際の差分が一致しているかを確かめる問いです。
問い2は入口です。訪問者がURLやフォームで送れる値は、悪意のある物かもしれません。 値を使う前に、消毒(形を限定する、許可した値だけを通す)されているかを見ます。
問い3は出口です。画面に出す値は、エスケープ(HTMLとして働かない形に変えること)されているかを見ます。
どちらも No.07 で見た形です。 差分の中に、外から来る値が出てきたら、入口の消毒を探します。画面に出る値が出てきたら、出口のエスケープを探します。
変更の前の控えと、戻す手順があるか。 本番に入れる前に、下見(本番とは別の場所で確かめること)をしたか。
AIの変更に、これらが書かれていなければ、聞きます。 控えと戻し方が答えられない変更は、内容が良くても保留(OKもNGも出さず、控えと戻し方が揃うまで止めておくこと)にします。
NGを出す時は、「だめ」だけでなく、直す点を返します。 AIは、理由があれば直せます。
返し方の例を、問いごとに挙げます。
迷ったら、AIに聞き返します。 聞き方の例:「この差分を、5つの問いで自分で判定して。分からない問いは『分からない』と書いて」
AI自身の判定は参考にとどめます。最後にOK/NGを決めるのは、あなたです。
○ よくある勘違い:テストが通った=OK → 動くことと、安全なことは別です。問い2、3は動作では見えません
○ よくある勘違い:AIの説明が丁寧=正しい → 説明ではなく差分を読みます
○ 関係する単元:差分の読み方 No.06、入力と出力 No.07
自分の子テーマに、AIが次のような追記をしたとします。 「URLの末尾に ?look=on を付けて開くと cookie が立ち、その人にだけ新しいデザインが出る」という物です。
この追記の差分を、5つの問いで判定して、OK/NGと、その理由を3つ書きます。
差分の本文は、この講座には載せません。あなた自身のサーバーに実物があるからです。 実物を読む練習なので、次の順で出します。
ssh を使ってサーバーに入り、子テーマのフォルダへ cd で移動するls でフォルダの中身が出ます)diff 控えのファイル名 functions.php と打つ。違う行が出る(+は足した行、-は消した行の形にしたい時は diff -u 控えのファイル名 functions.php)コマンドが分からない時は、AIに「子テーマの functions.php と控えの差分を出して」と頼めば出してくれます。 控えが無い場合は、AIに「追記の部分だけを、前後の行つきで出して」と頼みます。 それも問い4への答えになります。控えが無かったこと自体が、この変更の気になる点です。
課題で最初に開く所を、先に2か所示します。どちらも、これまでの単元に載せた実物の写しです。
1つ目は、No.06 に載せた LOOK_FOR_ALL の定義行です。
if ( ! defined( 'LOOK_FOR_ALL' ) ) {
define( 'LOOK_FOR_ALL', true ); // ← 本番切替はここ。true にすると、cookie が無い人にも全員に出る
}
2つ目は、No.04 に載せた lk_look_enabled の冒頭です。「新しい見た目を出すかどうか」を決める関数で、条件を上から順に調べ、最初に当たった所で return(答えを返して終わり)します。
function lk_look_enabled() {
static $on = null;
if ( null !== $on ) {
return $on;
}
if ( is_admin() || wp_doing_ajax() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
return $on = false;
}
if ( LOOK_FOR_ALL ) {
return $on = true;
}
...
}
この2つを並べて、LOOK_FOR_ALL の値が、関数の中のどこで効くかを読んでください。
次の観点を、問いに当てると、理由を3つ言いやすくなります。
ゲートは、見た目を出すかどうかを決める入口の関数や条件のことです。定数は、途中で変わらない名前付きの値のことで、LOOK_FOR_ALL がそれです。
理由は3つあれば十分です。 たとえ全部OKだったとしても、「どの問いで確かめて、何を見てOKにしたか」を3つ書けば、合格です。
5つの問い:①どのファイルの、いつ動くか ②外から来る値の消毒 ③出す値のエスケープ ④控えと戻し方・下見 ⑤全員か一部か。答えられない問いが1つでもあれば、OKは出さずに聞き返す。
問1 AIが「この変更で問題ありません」と丁寧に説明してきました。まずやることは?
問2 変更の内容は良さそうですが、「元に戻す手順」と「変更前の控え」が書かれていません。どう判定する?
問3 差分に、URLの ? 以降の値をそのまま画面に出す行がありました。どの問いに引っかかる?
問4 第3章③の抜粋の通り、LOOK_FOR_ALL が true で定義されています。cookie を持たない訪問者が、?look を付けずにトップページを開いた時、lk_look_enabled は何を返しますか?
出典:php.net「$_GET」(https://www.php.net/manual/ja/reserved.variables.get.php)、php.net「setcookie」(https://www.php.net/manual/ja/function.setcookie.php)、developer.wordpress.org「Data Validation」「Securing (Escaping) Output」(https://developer.wordpress.org/apis/security/)。5つの問いは、この講座の No.01〜09 の内容をまとめた物。