電子書籍の厳選無料作品が豊富!

php初心者&ど素人です

勉強のためにphpとmysqlで簡単なログイン機能を作ってみようと思いました

しかし、Locationでページ移動したときのセッションがセキュリティ的に安全なのかわかりません

ログインフォームのlogin.phpから自分自身に送信、ログインできたらセッションを付けてから
header("Location:hoge.php");でhoge.phpに飛ばしています

ログインした後のhoge.phpページではログイン確認をセッションidがあるかだけ確認しています

セッションidがなかったらログインページ戻す
if(!$_SESSION['id']){
header('Location: login.php');
exit();
}

質問1
セッションidは表示されている誰でも見れるidなのでセキュリティ的にまずいですか?
簡単にセッションのっとれるもんなんでしょうか?

質問2
一般的にはどうやているのでしょうか?
ログインページ全て(例えば編集画面とか会員情報とか)にmysqlから暗号化されたパスワードを取得して、それをセクションに入れて、また、mysqlからパスワードと照合したりしてるんでしょうか?

よろしくお願いします

A 回答 (4件)

>セッションidは表示されている誰でも見れるidなのでセキュリティ的にまずいですか?


>簡単にセッションのっとれるもんなんでしょうか?

「表示されている」とはどういう意味でしょうか?Cookieに格納すれば少なくともhttpリクエストのデータを覗かれない限りはわかりませんよね。

なお(データを覗かれている可能性も考慮して)セッションIDは必要に応じて定期的にregenerateするのが一般的です。

http://php.net/manual/ja/function.session-regene …



>一般的にはどうやているのでしょうか?
>ログインページ全て(例えば編集画面とか会員情報とか)にmysqlから暗号化されたパスワードを
>取得して、それをセクションに入れて、また、mysqlからパスワードと照合したりしてるんでしょうか?

ログインしているユーザIDをセッション変数で持ち回るくらいでしょうか・・・。わざわざ毎回照合したりはしません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
表示されているとは会員の一覧を表示で会員番号が表示されています
それをセッションidとして使っているためです
そもそもセッションidは皆さんはどうやって作っているのでしょうか?
やっぱりランダムな数字みたいにして作っているのですか?

お礼日時:2013/09/10 17:19

HTTP1.1ではLocationヘッダで相対URLを指定することは禁じられています。


HTTP1.0でも可能な限り(個人的には)絶対URLで書くべきだと思います。
なお、 'Location: http://..../login.php' は正確に入力してください。
半角ペースのあけ方がおかしかったりすると正常に遷移しない可能性があります。

PHPからMySQLに接続する際に注意すべき点をまとめているのでこちらをご覧ください。
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

以下は少しagunuzさんの回答と重複しますが再確認のために。

・$_SESSION['id'] が定義されているかどうかはisset構造でE_NOTICEを発生しないようにしてチェック。
・セッションの乗っ取りに関して http://qiita.com/mpyw/items/8f8989f8575159ce95fc
・ログインが終わった後はパスワードを保持する必要はないです。会員IDのみで十分です。SQL文を発行する際に「WHERE id = 会員ID」のようにします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
気をつけます

お礼日時:2013/09/14 16:44

>表示されているとは会員の一覧を表示で会員番号が表示されています


>それをセッションidとして使っているためです

会員番号は$_SESSION['id']という『セッション変数』に格納しているだけでは?



セッションIDはsession_start()すれば、自動的に割り当てられます(session_regenerate()すれば新しいセッションIDが割当て直される)。

http://php.net/manual/ja/function.session-start. …

下記のスクリプトで、セッションIDが割り当てられるのを確認してください。

<?php
session_start();
print session_id();
    • good
    • 0
この回答へのお礼

<?php
session_start();
print session_id();

上のコードで自動的に割り当てられてるのを確認しました

それで自分的に想像していたのがログインしたときにセッションidに入れて、ログインを判定できるようにすればいいのでは?と思ったのですが
<?php
session_start();
$_SESSION['id'] = session_id();




googleで検索して調べてみたらフォームから直接postされたidを代入していました
え?session_id()は利用しないの?と思ってしまいました
頭こんがらがっています

どうやるのが正しいのでしょうか?

検索して調べたログイン後のチェックphp(コピペで検索できるとおもいます)
<?php
session_start();

//パラメーター取得
$id = $_POST['id'];
$password = $_POST['password'];

//簡易ログイン
if ($id == "yamada" && $password == "pass") {
//ログイン成功

//セッション ID の振り直し
session_regenerate_id(true);

//セッションに値を格納
$_SESSION['id'] = $id;

お礼日時:2013/09/13 01:32

#書き忘れました(汗



>セッションidがなかったらログインページ戻す
>if(!$_SESSION['id']){

この記述はどこから?普通は(session_start()したあとで)

if (isset($_SESSION['id'])) {

のように、issetでチェックします。
    • good
    • 0
この回答へのお礼

if (!isset($_SESSION['id'])) {
でセッションがなければログインさせない処理にしました

お礼日時:2013/09/10 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!