例えばMySQLデータベースのidとnameを使って、「http//:○○/page.php?id=5&name=taro」という風にすることができると思うのですが、調べてもでてきません(PHPを始めてまだ2週間ほどの素人なので、ご容赦ください)。さらにmetaタグでnoindex,nofollowにすれば、認証不要でこのURLを知っている人しかアクセスできないようにできると考えています。
その方法についてご存知の方、ご教授いただけませんでしょうか?
(参考URLなど教えていただけると幸いです)
どうぞよろしくお願いします。
URLを指定することで特定のユーザのページを参照できる仕様ですと、URLを一部書き換えるだけで、第三者が任意上のユーザページを参照できる
ことになります。
例)
ttp://hogehoge/index.php?id=000001
(悪意のあるユーザ)id=000003番の情報を知りたい
↓
ttp://hogehoge/index.php?id=000003 ←下一桁を書き換え
id以外にも、非公開のnameパラメータを付与し、idのパラメータ操作だけでは参照できないようにした場合でも
公開ニックネームから非公開のnameパラメータを予想することで、特定のURLを参照することができます。
ttp://hogehoge/index.php?id=000003&name=????
(悪意のあるユーザ)id=000003番のnameがわからないとアクセスできないな
(悪意のあるユーザ)公開プロフィールのニックネームが花子か、それならnameはhanakoに違いない
ttp://hogehoge/index.php?id=000003&name=hanako
偶然一致すれば、アクセスが可能
簡略的に認証を実装したいのであれば、pahooさんが提案されているBASIC認証を導入するのが良いかもしれませんが
見た目や認証の挙動が、Webアプリケーションのデザインと上手くマッチしない問題があります。
PHPを始めて2週間程度ということは、まだフレームワーク導入には至っていませんよね?
Webフレームワークを活用することでセキュアなWebアプリケーションを比較的短期間で実装することができます。
車輪の再開発を避けるために、認証プラグインなどもありますので、まずは有名どころのWebフレームワークを学習されてはいかがでしょうか
会員サイトを構築するような場合、会員IDとパスワードの管理にMySQLが必須というわけではありません。
ログイン画面後のページも会員のみがアクセスできるように制限をかけなければならないので、セッションについて学んでください。
「ログイン画面を作る」が参考になると思います。
なお、パスワードをGETで渡すことは危険なのでやめてください。インターネット上を素のままのパスワードが行き来することになり、途中でパスワードが盗まれてしまうからです。
もしPHPによるログインにこだわらないのであれば、BASIC認証(基本認証)でアクセス制限をかける方が手っ取り早いでしょう。これはWebサーバの設定によります。
Apacheであれば、「基本認証でアクセス制限をかける方法」が参考になります。
さらにmetaタグでnoindex,nofollowにすれば、認証不要でこのURLを知っている人しかアクセスできないようにできると考えています
これは、おそらくGoogle検索に引っかからないというだけで、他の検索エンジンに拾われてしまう可能性があります。方法としては、お勧めできません。
>metaタグでnoindex,nofollowにすれば、
>認証不要でこのURLを知っている人しかアクセスできないようにできると考えています。
META が機能するという時点で、そのページにアクセスできているという事ですし
noindex,nofollow は「サーチエンジンへの登録をしないでくださいね」という
「お願い」ですから、相手が「お願い」を無視すれば、そのまま使われてしまいます。
ログイン形式が煩わしいという事ですが必要な処置です。 面倒という方に向けては
ログインページに「次回から自動的にログインする」などのチェックボックスを設けておいて
チェックが入っていれば cookiesにidとパスワードを保存するという処理を行えばよろしいでしょう。
使い方はあちこちで紹介されているので割愛します。
さらに、ログイン情報などを外部にもらさないようにするためには、
出来れば SSL での通信に対応したサーバを用いる必要もあるでしょう。
覚える事はまだまだ多々ありますが、徐々に覚えていってください。
URLを指定することで特定のユーザのページを参照できる仕様ですと、URLを一部書き換えるだけで、第三者が任意上のユーザページを参照できる
ことになります。
例)
ttp://hogehoge/index.php?id=000001
(悪意のあるユーザ)id=000003番の情報を知りたい
↓
ttp://hogehoge/index.php?id=000003 ←下一桁を書き換え
id以外にも、非公開のnameパラメータを付与し、idのパラメータ操作だけでは参照できないようにした場合でも
公開ニックネームから非公開のnameパラメータを予想することで、特定のURLを参照することができます。
ttp://hogehoge/index.php?id=000003&name=????
(悪意のあるユーザ)id=000003番のnameがわからないとアクセスできないな
(悪意のあるユーザ)公開プロフィールのニックネームが花子か、それならnameはhanakoに違いない
ttp://hogehoge/index.php?id=000003&name=hanako
偶然一致すれば、アクセスが可能
簡略的に認証を実装したいのであれば、pahooさんが提案されているBASIC認証を導入するのが良いかもしれませんが
見た目や認証の挙動が、Webアプリケーションのデザインと上手くマッチしない問題があります。
PHPを始めて2週間程度ということは、まだフレームワーク導入には至っていませんよね?
Webフレームワークを活用することでセキュアなWebアプリケーションを比較的短期間で実装することができます。
車輪の再開発を避けるために、認証プラグインなどもありますので、まずは有名どころのWebフレームワークを学習されてはいかがでしょうか
コメント(2件)
>インターネット上を素のままのパスワードが行き来することになり、
>途中でパスワードが盗まれてしまうからです。
POSTでも素のままで行き来するという点においては同じです。
POSTとの違いは、GETでアドレスと結びつけた状態では
「お願い」を聞いてくれないサーチエンジンなどに
登録されてしまう可能性があるからです。
GETだろうとPOSTだろうと、データを盗み見られるような状況であれば
セキュリティ的には大差ありません。
そのため暗号化やSSLなどが必要になってくるのです。