見出し画像

PHP で秘密のページを生成したい。簡単に。(ソースあり)

PHP でミニアプリを作っています。phpプログラミングの初学者や、興味がある方はぜひ最後までお読みください。

難易度:★★☆☆☆ 2/5 かな。

こんな用途で作成しました

「秘密のページを生成してURLを顧客に送付したい」

例えば、ユーザーにログインしてもらうためには、アカウントを作成しないといけません。

それって結構わずらしいもので、アカウントを登録してもらって、秘密のページを生成して、メールか何かで送信するというのは開発ボリュームも大きいので、用途に応じて、実現できるWEBアプリケーションを作成してみました。

秘密の内容も度合いによると思いますが、簡易的なものであれば、使えるのではないでしょうか。メール送信機能はありません。

1)管理画面的なもので、1クリックでURLが生成できる

2)一意のURLで、そのURLを知っている人しかわからない秘密のページ

3)Aさん=そのURLという管理はしない(個人情報に紐づけた場合、何かしらの原因での漏洩リスクを無くすため、別管理)

4)不要になったらURLを破棄したい。

といった要望です。もう少し細かな要望が出てくるかもしれませんが、開発を進めます。開発にかかった時間は3時間くらいです。有償ですがソースを置いておきますので、以下の動画による動作イメージの内容でよろしければ、ご購読ください。

アレンジ次第ではこんな用途が考えられます。

「その方の専用クーポンを表示する」「専用ブログとして記事を表示する」「決済画面を表示する」「会員限定ライブ配信で限定公開のYouTube動画を表示する」

URLを知っていれば見れますので、同じURLを使い回したり、人数分発行して、アクセス解析などを入れても良いかと思います。

時限設定でURLを削除する機能を追加すれば、期間限定配信もできますね。

大量に作成することも不可能ではありませんが、SQLデータベースを使っていないので、あまり大量には適しません。データベースを使用する方法に改修してもらえれば、さらに汎用性が広がります。

動作イメージ

ドメインはlocalhost:8888としています。

$ php -S localhost:8888

MacBookを使用していますが、ファイルを置いたルートでphpのビルドインサーバ起動して動作確認をしています。

※公開領域に設置する場合は各所セキュリティに気をつけて設置してください。

※当コードによる被害について一切の責任は追いかねます。自己責任にてお願いします。

ディレクトリ構成は以下の通りです。公開領域ルートは himitsuno/ とします。

himitsuno/
 ├── admin/
     ├── config.php(設定ファイル。最初にこれを開き、設定変更)
     ├── idlist.txt(空のファイル)
     └── index.php(管理画面ページ)
 ├── files/ (ID毎に暗号キーを照合するここにファイルを作ります)
 └── index.php(フロントページ。 404 Not Foundが初期値。認証できると秘密のページを表示)

config.phpは非公開領域に設置を推奨。便宜上同フォルダとします。

※いかなる場合も返金はお受け致しかねます。動作確認できるソースコードが欲しい方のみ購読をお願いします。

↓2/6追記

フロントについて解説です。

フロントはURLにアクセスして表示されるページのこと。URLをユーザーに送りますので、そのURLを知っている人は誰でもアクセス可能です。ただ、みだりにパラメータをつけずに直接アクセスしたり、無効なGET値でのアクセスでは表示できません。404 Not Foundを返します。

4つのGET値により、認証をします。c,d,e,fとします。秘密のページなので、総当たりされて解読されないようにすることが必要です。

今回は

c=固有値

d=日付

e=d+SOLT+c のハッシュ化(暗号化)

f=SOLT+c+d のハッシュ化としました。

(fにeをプラスするとなんかさらに安全な感じがします)

SOLTとは、ただ、c+dをハッシュ化すると難読ではないので、非公開のSOLT値を混ぜてハッシュ化します。

運用途中でSOLT値を変えてしまうと、認証できなくなってしまいます。

Wordpressをインストールしたことがある人なら、wp-config.phpファイルを最初に変更するので、ご存知かと思います。

wp-config.php の編集#セキュリティキー

保存しておく際に「mypassword」と書いたまま保存するのは厳禁で、データベースに不正アクセスがあった場合に、IDパスワードが分かり、最悪乗っ取りが可能です。データベースには、SOLT値を混ぜたハッシュ化したパスワード(長いランダムな英数字記号)を保存しておき、認証時に法則に従って認証します。当ソースもオープンソースですので、まさか、そのまま使う方はいないと思いますが、最初に必ず、SOLT値を変更します。

そんなことを理解するためにも、このソースコードを入れてみるのもよい勉強になるのではないでしょうか。

SQLデータベースは使わず、URLのGETパラメータと、予め生成したハッシュ化されたテキストファイルで秘密のページの認証を作ります。

ユーザーに渡されたURLとします。

http://localhost:8888/?c=b30dd6374bd2e32d9e97ecdcb07e4af7&d=20220205152529_1644074729&e=4eccab3501ca1109d04e64453979f3c1&f=32161446068780a2ebff23583f170e2c

GETパラメータはc,d,e,fがあります。このパラメータから法則がわかりますか??

上級ハッカーでないと難しいと思います。dは日付っぽいですけど、c,e,fはランダムな英数字です。ですが、phpに慣れている方なら気づいてしまう点があります。

はい。今回は一番安易なハッシュ値を生成するmd5関数を使っています。

安易というのは、md5は力ずくで解読が可能なことで今や常識

ハッシュ値を生成するということを理解する上で、安易な手法を用いているので、理解が深まった際には、別のアルゴリズムでハッシュ化してみてください。

PHP には便利なpassword_hash関数があります。その辺は別のブログ記事を参照していただくと分かりやすいかと思います。割愛します。

秘密のページに行くためにはいくつかの壁(if文)を用意してあります。

第一段階の壁

If:c,d,e,fのGET値があるか

それらがなければ404です。

次に、第二段階の壁

If: eの名のファイルがfiles/ディレクトリにあるか

eの名前のファイルにfが書いてあることで認証機構としました。

なので、eの名前のファイルの存在確認をし無ければ、404です。

第三の壁

If:eを開いたらfが書いてあるか

先言ってしまいましたが、w

eの名前のファイルにfの値を書いています。

なのでeのファイルがあったら、eを開いて、fが書いてあるかチェックします。

自動的に生成しているので、fが書いていないことや空ということは、ほぼあり得ませんが、GET値にて見えてしまっているので、それを第三の壁としています。

もしなければ、404です。

いずれもtrueであれば、秘密のページを表示します。

フロントの解説は以上です。


ここから先は

6,196字

¥ 500

この記事が気に入ったらサポートをしてみませんか?