- ベストアンサー
PHPについて
- 登録サイトで、仮登録のない新規登録は意味がないですか?
- サイトにメールアドレスを送信した時刻をクエリに張り付けて、再度、ユーザーが本登録の際、本登録の時刻ー(引く)サイトにメールアドレスを登録した時刻=24時間以内なら本登録できる画面に進める。とかにしても意味ないですか?
- 会員登録(パスワードとユーザー名)で実装した場合、データ管理のためにユーザーごとにフォルダーを作成(mkdir)する際、すでに作成済みのユーザー名かどうかを判断するのはやめたほうがいいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
有効期限を決めるのは、おっしゃられているものに加えて、トークンの衝突の可能性を減らすという理由もあると思います。 ハッシュは、あくまで、『限りなく衝突可能性が低い』のであって、衝突することもありますので。 また、SMSについては、仰るとおり、確実性安定性はありますが、 ・実装難易度が高い ・サブアカウントを作れない というところがデメリットと思います。 実際にSMSでの実装は行ったことはありませんが、LINEであったり、○○Payとか、Microsoftであったりといった、決済が発生するサービスで良く使われている印象です。 また、電話を使うので、実装難易度が高いです。APIサービスがあるようですが有料で、自ら実装するならおそらくサーバ構築から必要。 また、他に認証というと、独自で個人情報を管理しない方法としては、OpenIDを使う方法もあります。 Googleアカウントや、AppleIDをつかってログインすると言うもので、食べログなんかで実装されている奴ですね。 これも、OpenID Connectといったプロトコルにより実装するものです。SMSよりは簡単ですが、PHPやDBの勉強の範囲からは少し超えてくるかな、という感じです。 今回もながなが書いてしまいましたが、もし、自分のやりたいサービスがある、ということであれば今の実装のままで、サービスの内容について作り上げる方がよいと思います。 一般的に使われてる認証とかアルゴリズムとかは、ライブラリや、フレームワークを使いこなす時に、軽く概要を勉強するぐらいでよいかなと、思います。
その他の回答 (2)
- hogehoge78
- ベストアンサー率80% (433/539)
「2」については、別の回答者さんのおっしゃる通りと思いますので、「1.」のほうへの回答です。 URLのパラメータが (1) 予測困難であること (2) 改ざんしても通らないこと が満たされていれば、大体問題ないといえます。 (1)については、日付で時刻(秒)まで存在すれば、悪意ある第三者は予測困難ではありますが、何らかの方法(通信を傍受するとか)で、メールアドレスを送信した時刻が知られてしまっている場合、容易に乗っ取り・いやがらせが可能です。 また、完全に時刻が知られていない場合でも、1秒ずつずらしてURLにアクセスすることで引きあたってしまう可能性もあります(いわゆるブルートフォースアタック)。 ついては、予測困難であるハッシュ値をトークンとするのが妥当と思います。 結局のところ、悪意ある人間が常人には及びもつかないような方法を用いてハッキング・クラッキングを行おうとしているのが現状です。 その現状に対抗したのが、例に挙げていただいているサイトのようなノウハウや、以前ご質問されていたパスワードのハッシュ化のノウハウだったりするわけです。
補足
ありがとうございます。 とりあえず作りました。 今更なんですが、 「~時間以内にご登録ください」って ・ユーザーが本当に登録する気があるかどうか ・本人確認 のためだと思いますが、 他に何か理由がありますか? また、本人確認という点では 個人情報を扱うのはちょっと怖いですが smsのほうが有効ですよね?
- asciiz
- ベストアンサー率70% (6803/9674)
>すでに作成済みのユーザー名かどうかを判断するのはやめたほうがいいでしょうか? それは、ユーザー名そのままのディレクトリを作るってことですか? やれなくはありませんが、お勧めできません。 例えば、ユーザー名に「../../../../../usr/bin」 という文字列が指定されることも考えられるからです。 まあその場合でもアクセス権でエラーにはなるでしょうが、気持ちの良いものではありません。 上記のことを考えてユーザー名のマズい文字はあらかじめ置換するというのも手ですが、毎回きちんと忘れずに処理できるかどうか。 絶対忘れないから大丈夫、と考えていても、うっかりしてしまって、それが他人から見つかるとセキュリティホールになります。 元から、そういうことができないような方式にする方が望ましいです。 例えば、仮登録を受けたときに、ユーザー番号を発行し、その番号でディレクトリを作るのならまだマシです。 ユーザー名とユーザー番号の対応は、データベース等に記録します。 っていうかユーザーごとの個別データを保存したいなら、そうやってすべてデータベースに記録すれば良く、物理ディレクトリを作る必要も無くなってしまうのですけどね…。
お礼
ありがとうございます。 その方が安全なのでそうしたいと思います。
お礼
詳しくありがとうございました。