セッションの安全性について

このQ&Aのポイント
  • セッションidは表示されている誰でも見れるidなのでセキュリティ的にまずいですか?簡単にセッションのっとれるもんなんでしょうか?
  • 一般的にはどうやっているのでしょうか?ログインページ全て(例えば編集画面とか会員情報とか)にmysqlから暗号化されたパスワードを取得して、それをセッションに入れて、また、mysqlからパスワードと照合したりしてるんでしょうか?
回答を見る
  • ベストアンサー

セッションについて

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からパスワードと照合したりしてるんでしょうか? よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>セッションidは表示されている誰でも見れるidなのでセキュリティ的にまずいですか? >簡単にセッションのっとれるもんなんでしょうか? 「表示されている」とはどういう意味でしょうか?Cookieに格納すれば少なくともhttpリクエストのデータを覗かれない限りはわかりませんよね。 なお(データを覗かれている可能性も考慮して)セッションIDは必要に応じて定期的にregenerateするのが一般的です。 http://php.net/manual/ja/function.session-regenerate-id.php >一般的にはどうやているのでしょうか? >ログインページ全て(例えば編集画面とか会員情報とか)にmysqlから暗号化されたパスワードを >取得して、それをセクションに入れて、また、mysqlからパスワードと照合したりしてるんでしょうか? ログインしているユーザIDをセッション変数で持ち回るくらいでしょうか・・・。わざわざ毎回照合したりはしません。

flash0
質問者

お礼

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

その他の回答 (3)

noname#244856
noname#244856
回答No.4

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」のようにします。

flash0
質問者

お礼

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

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>表示されているとは会員の一覧を表示で会員番号が表示されています >それをセッションidとして使っているためです 会員番号は$_SESSION['id']という『セッション変数』に格納しているだけでは? セッションIDはsession_start()すれば、自動的に割り当てられます(session_regenerate()すれば新しいセッションIDが割当て直される)。 http://php.net/manual/ja/function.session-start.php 下記のスクリプトで、セッションIDが割り当てられるのを確認してください。 <?php session_start(); print session_id();

flash0
質問者

お礼

<?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;

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

#書き忘れました(汗 >セッションidがなかったらログインページ戻す >if(!$_SESSION['id']){ この記述はどこから?普通は(session_start()したあとで) if (isset($_SESSION['id'])) { のように、issetでチェックします。

flash0
質問者

お礼

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

関連するQ&A

  • PHPのセッションについて

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • PHP
  • 会員ページ SESSIONについて

    レンタルサーバはさくらインターネット、プランはプレミアムです。 PHPは5.2.171、MySQLは5.1です。 login.phpから各メンバーのIDとPWを入力してデータベース内ののデータと一致したら、main.phpにLocationでとぶようにしています。 2日前ほどからログインができなくなり、大変困っています。(それまでは問題なくログインができた。) 原因はわからないのですが、色々検証したところ、 login.phpでログインしたときにmain.phpでIDが取得できていないということがわかりました。 コードは下記のようになります。 login.php if ($uid != "" || $upass != "") { $link = mysql_connect($DB_HOST,$DB_USER,$DB_PASS); mysql_select_db($DB_NAME,$link); $uid = mysql_real_escape_string($uid, $link); $upass = mysql_real_escape_string($upass, $link); $userQuery = sprintf("SELECT count(*) as `cnt` FROM `member` WHERE `id`='%s' AND `password`='%s'",$uid,$upass); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $count = $row['cnt']; if ($count == 1) { session_start(); $_SESSION['ok_flg'] = 1; $_SESSION['uid'] = $_REQUEST['id']; header("Location: main.php"); exit; } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } 省略部分が少しありますが、特に問題ないと思います。 main.php session_start(); if ($_SESSION['ok_flg'] != 1) { header("Location: /"); exit; } if (!isset($_SESSION['uid'])) { header("Location: /"); exit; } $uid = mysql_real_escape_string($_SESSION['uid'], $link); $userQuery = sprintf("SELECT * FROM `member` WHERE id='%s' ",$uid); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $user_name = $row['user_name']; } echo $user_name; としています。 ここからが問題なのですが、 1.ログインするとSESSIONファイルが2つ発行されてしまう。  1つ目は空のファイル。2つ目がIDなどが記載されているファイル。 main.phpのsession_start()を取ると1つのみの発行。(IDなどが記載されている方。) 2.main.phpに切り替わったときに$_SESSION['ok_flg']と$_SESSION['uid']の値が取得できないためlogin.phpに戻される。 3.main.phpのsession_start()を取ればページは表示されるが、session_id()も$_SESSION['ok_flg']と$_SESSION['uid']の2つも取得できない。 3.main.phpでsession_start()を取れば他のページはsession_idは取得できるが$_SESSION['ok_flg']と$_SESSION['uid']が取得できない。 4.session_start()と併用で$_GETも使用しているページがあるが$_GETを使用しているページも2と同じ現象になる。 以上ですが、お分かりになる方がいらっしゃいましたら、教えていただけないでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • セッションをログインについて

    はじめまして。 今、セッションを使ったログインのページを作っています。 流れは、 1.ログインページでIDとパスワードを入力。 2.入力したID・パスワードがあらかじめMysqlに保存してあったのと一致していたら会員ページに移動。 3.セッションにID・パスワードを保存してブラウザを閉じない限り、次回はログイン無しで会員ページに直接いけるようにする。セッションに保存されてないときはログインページにもどす。 以上の流れにそってプログラムを作りました しかし1・2は上手くいったのですが3の部分がうまくいきません。セッションにIDとパスワードを保存することができてるようなのですが、ブラウザを閉じずに、いったん別にページに行き、もう一度会員ページにもどろうとすると、ログインページ戻されてしまい、もう一度ログインしなければいけません。 以下に今回のプログラムを書きました。このプログラムのどこを直せば、いいのかお分かりになる方いらっしゃいましたらアドバイスのほうよろしくお願いします。 使用環境は PHP 5.2.5(xampp使用) MySQL 5.0.51a register_globals = Onになっています。 /*ログインページは省略しました。パスワードとユーザーIDを入力してこのページに飛びます。*/ <?php function redirect($url) { header("Location: ".$url); exit; } session_start(); /*保存していたセッションが存在するか確認なければログインのページにもどす。$_SESSION['username']) の部分を$_POST…にしたのですがそれでも結果は同じでした。*/ if(empty($_SESSION['username']) || empty($_SESSION['password'])) redirect("loginpage.php"); $user = $_POST['username']; $pass = md5($_POST['password']); /*Mysqlへ接続。セッションの問題が解決したらMysql用のクラスを作る予定です。*/ $dbHost = "localhost"; $dbUser = "*****"; $dbPass = "******"; $dbDatabase = "mysql"; $db = mysql_connect("$dbHost", "$dbUser", "$dbPass") or die ("Error connecting to database."); mysql_select_db("$dbDatabase", $db) or die ("Couldn't select the database."); $result=mysql_query("select * from users where username='$user' AND password='$pass'", $db); $rowCheck = mysql_num_rows($result); /*ID・パスワードが間違ってたら、ログインページに戻す。*/ if(empty($rowCheck)) redirect("loginpage.php"); $row = mysql_fetch_array($result); /*IDとパスワードをセッションに保存*/ $_SESSION['username'] = $user; $_SESSION['password'] = $pass; if($rowCheck > 0) { while($row = mysql_fetch_array($result)) { } /*ログイン成功したら会員ページを表示。*/ echo "Login Succeeded!".$_SESSION['username'];/*←セッションに保存されてるかのテスト。ちゃんと表示されました*/ include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link1.php"); include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link3.php"); } else { /*ID・パスワードを間違えてたらログインページに戻す。*/ echo 'Incorrect login name or password. Please try again.'; redirect("loginPage.php" ); } ?>

    • ベストアンサー
    • PHP
  • ログインページ

    PHPとMySQLで ログインするときに、ログインIDとパスワード(md5処理)を 入力する普通のログインページをつくったのですが 照合するときに例えば ログインIDがphp パスワードが178だとログインできず ログインIDがabe パスワードがabeだとログインできる ログインIDがパスワード一致の場合だけ何故かログインできて しまうのですが、自分で書いていてなんなんですが 以下のプログラムではそういう風になってしまうんでしょうか。 <?php if($_POST["keep_login"] != ""){ session_set_cookie_params(365*25*3600); }else{ session_set_cookie_params(0); } session_start(); require("config.php"); if($_POST["passwd"]==""){ $_POST["passwd"]=time(); } if($_POST["action"]=="login"){ $login_id = mysql_real_escape_string($_POST["login_id"]); $sql="select * from users where login_id= '$login_id' and state='0'"; $result=mysql_query($sql); $users=mysql_fetch_array($result); if($users["passwd"]==md5($_POST["passwd"])){ $_SESSION["login_id"]=$_POST["login_id"]; $_SESSION["auth_code"]=md5($magic_code.$_POST["login_id"]); $_SESSION["name_kanji"]=$users["name_kanji"]; $sql="update users set login_date = '".date('Y-m-d H:i:s')."' where login_id= '".mysql_real_escape_string($_POST['login_id'])."' and state='0'"; $result=mysql_query($sql); if($_GET["redirect"] !=""){ header("Location:".$_GET["redirect"]); exit; }else{ header("Location:".$site_url); exit; } }else{ $message='<br><br><font color="red">ログインできませんでした</font><br>'; } } ?>

    • 締切済み
    • PHP
  • セッションについて教えてください。

    PHPを独学で勉強中の初心者です。(HTMLとCSSくらいしか分からない所からのスタートです) ログインフォーム→パスワード処理→コンテンツ表示というながれで作っています。 質問は、セッションの有効期限はデフォルトではブラウザを閉じるまでと聞いたのですが、それはウインドウを閉じるではなく、アプリケーションを終了するまでということでよいのでしょうか?ウインドウを閉じただけだと、コンテンツを表示できてしまいます。 また、コードがこんなんでよいものかアドバイスよろしくお願い致します。 --パスワード処理-- <?php session_start(); $id =p; $password =11; $n_id = $_POST["n_id"]; $n_password = $_POST["n_password"]; if(($n_id == $id ) && ($n_password == $password)){ $_SESSION['pass'] = 1; header("Location: page1.php"); }else{echo "IDまたはパスワードが違います。"; } ?> ----コンテンツページ----- <?php session_start(); if(isset($_SESSION["pass"]) && $_SESSION["pass"] == 1){ echo "コンテンツ"; echo "<html><head> <meta http-equiv=Content-type content=text/html; charset=EUC-JP> </head><body>"; echo "<form action =logout.php method=post>"; echo "<input type=submit name=sbm value=ログアウト>"; echo "</form></body></html>"; }else{ header("Location:login1.php"); } ?>

    • 締切済み
    • PHP
  • セッションを使ったログインページでのエラー

    前にもセッションを使ったログインページについて質問したものです。 上記の通りセッションを使ったログインページを作っております。 前回このソースを載せたときセキュリティー的にとても危険だというご意見をいただきました。何分まだ初心者ですのでどうかご了承ください。 ソース /*ログインのページは省略しました。ログイン後ID・パスワードが正しいか、そして訪問者がログインせずにこのページに直接アクセスした際にログインページにジャンプするようにするようにするプログラムです*/ <?PHP if (!isset($user) || !isset($pass)) { header( "Location: loginPage.php" ); } elseif (empty($user) || empty($pass)) { header( "Location: loginPage.php" ); } else { $user = addslashes($_POST['username']); $pass = md5($_POST['password']); $dbHost = "localhost"; $dbUser = "*****"; $dbPass = "*****"; $dbDatabase = "mysql"; $db = mysql_connect("$dbHost", "$dbUser", "$dbPass") or die ("Error connecting to database."); mysql_select_db("$dbDatabase", $db) or die ("Couldn't select the database."); $result=mysql_query("select * from users where username='$user' AND password='$pass'", $db); $rowCheck = mysql_num_rows($result); if($rowCheck > 0){ while($row = mysql_fetch_array($result)){ session_start(); session_register('username'); echo 'Success!'; header( "Location: checkLogin.php" ); } } else { echo 'Incorrect login name or password. Please try again.'; } } ?> このようなプログラムを作ったのですが、ちゃんとパスワードをいれても、ちゃんと認証されずに、ログインのページ戻されてしまいます。 おそらく if (!isset($user) || !isset($pass)) { header( "Location: loginPage.php" ); } elseif (empty($user) || empty($pass)) { header( "Location: loginPage.php" ); } の部分がおかしいのかと思いますがどう変えたら良いのかよく分かりません。また、おかしいと思った部分を削除したら普通にログインはできるのですが、今度は一度ログインしても他のページに移動した後もう一度このページに行くと、もう一度ログインしないとアクセスできなくなりました。 まとめると、お聞きしたいことは、2つです。 (1)紹介したのプログラムでログインしてもちゃんとログインが認証されない。これを解消するにはどうすればいいのか? (2)ユーザーがログインした後もう一度このページにアクセスした場合もう一度ログインさせなくてもいいようにすればどうすればよいのか。 もし可能でしたら、解決するためのプログラムを(さらに可能でしたら紹介したプログラムを生かした形で)添えてアドバイスしていただけないでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • session_startについて

    初心者です。 以下のように、ログイン時、設定画面adminpage.htmlに行くように作っています。 sakuraインターネットでは動くのですが、 もう一方の違うサーバーでは、login.phpに戻ってきてしまいます。 原因が判りません。 手がかりが欲しいのですが、 お詳しい方がおられましたら教えてください。 よろしくお願い致します。 <?php require("MySmarty.class.php"); require('Settings.class.php'); $smarty = new MySmarty(); $settings = new Settings; session_start(); $id = $_SESSION['id']; $pass = $_SESSION['pass']; //idとパスワードに不具合有れば、login.phpへ戻る。 if( ( $id == '' ) || ( !$settings->isValidUser($id,$pass) ) ){ header("Location: login.php" ); print $_SESSION["id"]; print $_SESSION["pass"]; print $id; print $pass; exit; } $settings->loadSettings(); $smarty->assign('maintitle', $settings->maintitle); $smarty->assign('subtitle', $settings->subtitle); $smarty->assign('error_message', $settings->errorm); $smarty->display('adminpage.html'); ?>

    • ベストアンサー
    • PHP
  • 携帯サイトでsessionは使用可能か

    HTML・PHPで3キャリア対応携帯サイトを作成しているのですが、session_id()などのセッション関連は携帯サイトでも使用できるのでしょうか? 例えば、ログインページで入力フォームの値(IDとパスワード)をsesession_id()で次のページに渡す際(header("Loca"))、PCのブラウザ(IE)では値を渡せ、かつ、次のページに進んだのですが、i-modeのエミュレータ(imodetool)では、次のページに移らず、ログイン画面に戻ってしまいます。 なお、ソースは以下のように記述しています。 if($_POST["name"] == XXXX) { session_start(); $_SESSION["user_id"] = $_POST["name"]; header("Location: http://xxxxxxxx.php?id=". session_id()); exit(); } お手数ですが、回答頂けると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • セッション変数のセキュリティ

    プログラム初心者です セッション変数の安全性について教えてください ログインしているかをセッション変数で判定しています。セッションidは使っていません 質問1 悪意をもったハッカーがセッション変数を取得することはできますか?それともセッション変数はクッキーと違い安全なんでしょうか? 質問2 セッション変数の保持時間は決まっていますか? session_start(); if(!isset($_SESSION['id'])){ header('Location: login.php'); exit(); } よろしくお願いします

    • ベストアンサー
    • PHP
  • 会員制ログインページ

    会員制ログインページを製作しているのですが なかなかうまくいきません <?php if($_POST["keep_login"] != ""){ session_set_cookie_params(365*25*3600); }else{ session_set_cookie_params(0); } session_start(); //データベースに接続するphpです require("config.php"); if($_POST["passwd"]==""){ $_POST["passwd"]=time(); } //照合しているのですが、いろいろ試した結果ここが おかしいようなのですが if($_POST["action"]=="login"){ $sql = "select * from users where login_id = '".mysql_real_escape_string($_POST["login_id"])."' and state = '0'"; $result=mysql_query($sql); $users=mysql_fetch_array($result); if($users["passwd"]==md5($_POST["passwd"])){ $_SESSION["login_id"]=$_POST["login_id"]; $_SESSION["auth_code"]=md5($magic_code.$_POST["login_id"]); $_SESSION["name_kanji"]=$users["name_kanji"]; $sql="update users set login_date ='".date('Y-m-d H:i:s')."' where login_id='".mysql_real_escape_string($_POST['login_id'])."' and state='0'"; $result=mysql_query($sql); if($_GET["redirect"] !=""){ header("Location:".$_GET["redirect"]); exit; }else{ header("Location:".$site_url); exit; } }else{ $message='<br><br><font color="red">ログインできませんでした</font><br>'; } } ?>

    • 締切済み
    • PHP