独学!Webサイト構築日誌

36日目:消せないファイル。

8:00

WindowsUpdateが溜まっていたので更新し、既存プログラムがちゃんと動いているか挙動確認したまでは良かった。

昨日DLしたファイルを動かすと変な挙動。
中○製で怪しかったけど、やっぱり挙動が変だった。1つのファイルを除いて削除できたが、あと1つが消せない。
コマンドプロンプトからでも無理だったので、セーフモードで削除。気持ち悪い。二度とDLせん。

今日の目標は故知覧。
  1. 画像認証の画像を更新させる。

10:30

処理時間が長かったので、昨日のエラーについて本で調べているところです。
いくつか解決方法が載っていたので、最後まで読んでから試していきます。



16:00

ひとまず辞書のような本を1冊ザックリ読み終えまして、現在抱えている問題について6個ほど解決策を見つけました。
【説明】辞書のような厚みがあるが、何か問題が起こったときにザーっと読むと解決策が見つかる。説明も分かり易く、コードも適切で良い。この本のおかげで諸問題が6つ解決したので良かった。 ※Kindle無し。楽天は中古。

画像認証の画像を更新させる。

昨晩 contact.php に opcache_reset() 入れても無理だったので、ファイル名を明示的に変更してやればいいんじゃないかと。

17:00

下記を試してみたが、画像が2つ交互に表示されるだけだった。
            
$filename0 = '../保存先/pass0.jpg';
$filename1 = '../保存先/pass1.jpg';
if (file_exists($filename0)) {//ある
    imagejpeg($im, $filename1);
    echo '<img class="passText" src="'. $filename1. '" alt="check">';
    unlink($filename0);
} else {//ない
    imagejpeg($im, $filename0);
    echo '<img class="passText" src="'. $filename0. '" alt="check">';
    unlink($filename1);
}
            
        
ここで1つ疑問なのが、サーバー上では削除されている画像がどうやって表示されているのかてこと。
試しにhtmlそのままで、画像だけ削除してみると何も画像は表示されない。(エラー時の小さい□が表示されるだけ)

てことは、下記2つの憶測が当てはまる。
・データの存在の有無はちゃんと確認しているが、中身までは常に見に行ってない。
・どこかに格納されている以前の情報を優先的に表示するような仕様になっている。

優先的に表示されるとなると、cookieとかキャッシュとかその辺りかな。調べてみよう。

18:00

キャッシュが悪さしているのは分かりましたが、キャッシュを保存させないphpを入力しても全く改善されない。
ちょっと強引ですが、疑似無限にループを回して、都度新しいデータを作成&読み込みさせましょう。
ユーザーのキャッシュが恐ろしいことになりますが、そんなに何度も読み込み直す人は、相当私のことが好きな人か、嫌がらせを目論んでる奴ぐらいでしょうから、どちらにしても大丈夫でしょう。

18:30

強引だけどもイケた。
            
php ※hiraganaCheck.php全文
<?php
$im = imagecreatefromjpeg('../保存先/passBase.jpg');//ベース画像設定
$textColor= imagecolorallocate( $im, 0, 0, 0);
$font = '../保存先/HGRSMP.TTF';
$textHiragana='あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもやゆよらりるれろわをん';
$textPart = '';
$passText = '';
for($i=0; $i<5; $i++){ //5文字入れる
    $textPart = mb_substr($textHiragana, mt_rand(0, mb_strlen($textHiragana) - 1), 1,"UTF-8");
    $kakudo = mt_rand(-15, 15);
    imagettftext($im, 25, $kakudo, 25+(40*$i), 35, $textColor, $font, $textPart);//画像に文字書き込む
    $passText = $passText. $textPart;
}
file_put_contents('../保存先/pass.txt', $passText, LOCK_EX); //判定用

$fileP = '../保存先/pass';
for($mugen=0;$mugen<10000;$mugen++){
    $filename = $fileP. $mugen. '.jpg';
    if($mugen==9999) {//最大値まで行ったら
        unlink($filename);
        $filename = $fileP. '0.jpg';//ファイル名初期化
        imagejpeg($im, $filename);
        echo '<img class="passText" src="'. $filename. '" alt="check">';
        break;
    } else if (file_exists($filename)) {//見つかるまで回す
        unlink($filename);//ファイル削除
        $filename = $fileP. ($mugen+1). '.jpg';//ファイル名更新
        imagejpeg($im, $filename);
        echo '<img class="passText" src="'. $filename. '" alt="check">';
        break;
    }
}
imagedestroy( $im ); // 後始末
?>
            
        

...が、別の問題として、同じタイミングで2人以上の人が問い合わせようとしたときに、上記の仕様だと先にアクセスした人の方が認証に失敗するということになってしまう。

...んー...

同時にお問い合わせされるような人気サイトになることを見込んで、5つぐらいデータを保持しておいて、そのどれかと一致すればOKにすることは簡単ですが、やたら画面更新させる嫌がらせを受けたら回避できないな...。

それこそあれだな、文字列を決めたときにCookieで文字列を投げれないかね。
と考えたけども、そうなるとマクロあたりで簡単に攻撃食らうな...むむむむ。
どうにかユーザー側じゃなくて、コチラ側に一時的に保持しておきたいんだけどね。



19:00

・文字列をid1と紐づけ。
・id1をCookieとしてユーザーに投げる。
・文字列とid1の紐づいたものを保存。
・送信ボタンを押したときに、ユーザーのid1(Cookie)を確認。
・文字列と入力が一致しているか確認。
ていう流れが理想だな。

夕飯食べてから引き続き考えてみる。

22:00

風呂から上がりまひた。

0:30

そういう事か、やっとcookieの挙動を理解した。
cookieてのは、最初訪問したときは当然空白の状態で、(保持期間にも寄るが)2回目以降で取得できるようになる。

なので、
1回目の訪問時:cookieに値を渡せるが、取得は出来ない。(cookie:空白)
2回目の訪問時:cookieに値を渡せるが、取得も出来る。(cookie:1回目の値)

これの何が問題かと言うと、同一プログラム内でsetcookie → $_COOKIEの順に記述しても、上記と同様の動作になる。

なので、
1回目: ('渡す値', 1) を渡すと、$_COOKIEをどこで取得しようがcookieは空白。
2回目:('渡す値', 2) を渡すと、$_COOKIEをどこで取得しようがcookieは1。
てことだな。

なんとなく分かってきたぞ。
投げた値を上手に受け取れたらゴールは近い。



...が、眠い。
凄い中途半端だけど、あくびが止まらないぐらい眠いので寝ることにする。

をやすみ。



作成日:2021/01/17 - 更新日:2021/01/26

≪ 35日目≪ 一覧に戻る ≫37日目 ≫

HOME > 日誌一覧 > 36日目:消せないファイル。