セッションを使用したwebサイトのユーザ認証について

このQ&Aのポイント
  • phplibを使用せずにセッションを利用したwebサイトのユーザ認証方法について教えてください。
  • セッション名によるユーザ判定でログインを行うセッションベースのユーザ認証は安全なのでしょうか?
  • 一般的なパスワード制のwebページではどのような処理が行われているのでしょうか?
回答を見る
  • ベストアンサー

セッション

phplibを使わないでユーザ認証を用いたwebサイトを作ろうと思います。 shinki.php => login.php => contents1.php=> contents2.php .... のような流れの構造で、直接contents1.phpなどに入られないようにセッションを使用したいと思います。 ユーザが持っているセッション名と、サーバー側のセッション名が一致するという条件だけでログインしたユーザと考えていいのでしょうか? 現在はこのような感じになっています。 まずshinki.phpでユーザー登録します。この時ユーザ情報と暗号化されたパスワードをDBに保存。 login.phpでユーザIDとパスワードを入力し、DBのデータと一致するとcontents1.phpに進む。この時セッションを発行し、idと暗号化されたパスワードをセッションに記憶させる。 contents(1 | 2).phpのコード <? session_start(); // PostgreSQL 接続 if (!($cn = pg_connect("dbname=****"))){die;} // SQL文 $sql = "select * from ***** where id='$_SESSION[id]'"; if (!($rs = pg_exec($sql))) {die;} $ct = pg_numrows($rs); for ($i = 0; $i < $ct; $i++) { $array = pg_fetch_array($rs, $i); } // セッションのパスワードとデータベースのパスワードが一致 if($_SESSION[pass] == $array['pass']){ login_html(); }else{ print "ログインしてください。"; } // PostgreSQL 切断 pg_close($cn); function login_html(){ print "<html><head><title><title></head><body>"; .... .... } ?> このような構造には、セキュリティー的な問題はあるのでしょうか? おそらくいろいろ問題があると思いますので、ご指導お願いします。 一般的なパスワード制のページではどのような処理をしているのでしょうか? よろしくお願いします。 os:linux httpd:apache1.3.27 postgreSQL php4.x.x

  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
noname#3574
noname#3574
回答No.2

読み間違いしていました、前回の回答を撤回します; 申し訳ないです。 その処理で問題無いと思います。 セッションIDの取り回しに気をつける必要があります。IPAのドキュメントや書籍、雑誌に色々と載っていると思います。 失礼いたしました (_ _)

参考URL:
http://www.ipa.go.jp/security/awareness/administrator/secure-web/chap6/6_index.html
nancy_and_andy
質問者

お礼

ご解答ありがとうございました。 参考URLを読んでみようと思います。 確かに、#1でご指摘されたようにセッションを使う前に、セッションとは何かがいまいち理解しきれていない気がします。 phplibのコードを読んで何かが見えかけた気も・・・

その他の回答 (1)

noname#3574
noname#3574
回答No.1

if($_SESSION[pass] == $array['pass']){ とやっているようですがセッションに情報そのものを含めるべきではありません。 セッションIDはサーバーに格納された情報を引き出す鍵として扱うべきです。 IDやパスワードなどの情報そのものでないとしてもセッションハイジャックの危機は認識する必要があります。 セッション自体に情報そのものを格納しない理由は銀行のキャッシュカードに預金情報そのものが格納されているとどうなるかを考えると想像できるでしょうか。銀行側で口座データを管理してこそ信頼できるワケです。 まずセッションの使い方だけでなく考え方も書かれた書籍なりを探し、またはフリーなコードを読み、自己流でない先達の知恵と知識からセッションへの考え方を得てください。 その次にその方法を自分でセッションを作って色々試して踏襲してみると肌で理解できるようになると思います。 遠回りに思えてこれが一番の近道な気がします。 Mozilla を使うとCookie情報の閲覧が楽になります。

関連するQ&A

  • ログインページ

    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のセッションがちゃんと動きません。 他のプログラムを同じ環境で動かしたところうまく動きましたので、 コードのほうに問題があると思います。 以下のようなコードを書いています <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; まず最初はelseifのほうのプログラムを動かして、session変数に値を入れます。 その後、もう一度このファイルに飛んで、二回目はsession変数が入っているので ifのほうに入って、ifの中の処理をするという形にしたかったのですがif文のほうの処理に行きません。 ちなみに、二回目に見たときはURLの欄にセッションIDは表示されていませんでした。 テストとして <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } としてみたところ、if文の処理は動いていました。 なにが悪いのでしょうか? 不足した情報がありましたら開示したいと思いますので教えていただければと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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
  • セッションについて教えてください。

    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
  • セッションについて

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

    • ベストアンサー
    • PHP
  • postgreSQL + PHPの連携

    現在postgreSQLとPHPを使い、 勉強を兼ねスクリプトを組んでいます。 が、早速つまづいてしまいました。。 [ID][名前][年齢]の3つのカラムがあります。 そこからIDが「10」の行を取得したいのですが、 どのように書けばよいのでしょうか? $sql = "SELECT * FROM TAB where(ID = 10)"; $rs = pg_query($cn, $sql); $row = pg_fetch_array($rs); echo "$row[ID]、$row[名前]、$row[年齢]"; 願わくば、と上のように書いたのですが、 「、、」と表示されるだけで…。 ご教示、お願いいたします。

    • ベストアンサー
    • PHP
  • PHPとPostgreSQL接続 (スキーマ)

    いつもお世話になっております。 現在、PHP(5.3.1)とPostgreSQL(9.2)で開発をしております。 エラーが発生しており大変困っております。 こちらが発生するエラーです。 Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: schema スキーマが見つからないとのことです。 そして、以下がコードとなります。 <?php // PostgreSQL Connect if (!($cn = pg_connect("host=*** port=*** user=*** password=*** dbname=***"))) { die; } // PostgreSQL Select $sql = "select * from t_test.na1"; if (!($rs = pg_exec($sql))) { die; } // PostgreSQL Get Records $ct = pg_numrows($rs); for ($i = 0; $i < $ct; $i++) { $item = pg_fetch_array($rs, $i); $txt = "${item[1]}"; } // PostgreSQL Disconnect pg_close($cn); ?> 現在のデータベースのスキーマについてですが「na1」と「public」の2つが存在しています。 試しに、na1とpublicのテーブルをまったく同じにして SQLの部分を「select * from t_test」に変更すると「public」側のテーブルが覗けます。 しかし、SQLの部分を「select * from t_test.na1」に変更すると「スキーマが見つかりません」 というエラーが発生してしまいます。 スキーマがあるにもかかわらずこのエラーがでてしまうため原因が分からず困っております。 もしお分かりになる方いらっしゃいましたら、教えていただければと思います。 何卒よろしくお願いします。

    • ベストアンサー
    • 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
  • セッションidの使い方について

    参考書を読んだり調べたのですが、セッションidの使い方がよくわからないので質問させて下さい。 PHP4.3.10、 session.use_only_cookies off session.use_trans_sid offになっています。 携帯でログイン(login.php)後 メニュー(menu.php)でDBに登録されているIDとパスワードが一致したら SIDを発行してユーザの識別をしたいと考えています。 そこでわからないことがあります。 メニューにはA.php、B.php・・とあるのですが リンクするたびに <a href="A.php?<?php echo SID;?>">A.php</a> <a href="B.php?<?php echo SID;?>">B.php</a> のようにするのか、または$SID=session_id();のようにするのでしょうか。 そしてA.phpやB.phpでの識別はSIDをファイルなどに保存してその都度 これを呼び出し比較していくのでしょうか。 また、$_SESSION['a']="123";と session_register("a"); $a="123"; というのは同等の意味でしょうか。 質問ばかりですがどうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • SESSION の受け渡し

    初心者ですので、見当違いの質問の場合はご容赦ください login.php(ユーザ認証) cart.php(ショッピングカート) という構成でSESSION変数の受け渡しを行いたいのですが login.php で認証確認後、 session_start(); $_SESSION['su_id'] = $u_id ; $_SESSION['su_name'] = $u_name ; のように設定の上 require "./cart.php"; でcart.phpを呼び出し(?)ています require直後のcart.phpの初期状態では $_SESSION['su_id'] 、$_SESSION['su_name']ともに正しく表示しますが submit等(次ページ表示などで)で再表示を行うと $_SESSION['su_id'] 、$_SESSION['su_name']が引き継がれません cart.phpにおける session_start()時に、新しいIDに置き換わっているからだと思いますが このようなケースではどういう処置を行えばよいのでしょうか? 幼稚な質問かどうかすら判断できていないのですが コメントを頂ければ助かります よろしくお願いします

    • 締切済み
    • PHP

専門家に質問してみよう