• 締切済み

PHP ログインシステムについて

お世話になります 現在ローカルで下記PHPのテストを行っています PHP初心者の為、セキュリティ面並びに不具合が心配で書き込みさせて頂きました 恐れ入りますがおかしな点がないかチェックして頂けませんでしょうか 宜しくお願いいたします データベースのバージョンはMySQL 5.5です ***************************************** <?php session_start(); $error_message = ""; if (isset($_POST["login"])) { $id = htmlspecialchars($_POST['id']); $password = htmlspecialchars(base64_encode(pack('H*', sha1($_POST['password'])))); $_SESSION['id'] = $_POST['id']; $_SESSION['password'] = $_POST['password']; $db = mysql_connect("***","***","***"); if (!$db) { die('接続失敗です。'.mysql_error()); } mysql_set_charset("utf8"); $db_selected = mysql_select_db("***", $db); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } $result = mysql_query("SELECT * FROM ***"); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } function x($result) { return mysql_real_escape_string($result); } while ($row = mysql_fetch_assoc($result)) { if($id == $row['id'] && $password == $row['password']){ header("Location:./instance.php"); } } $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy(); $error_message = "ユーザ名もしくはパスワードが違っています。"; } ?> <html> <head><title>ログイン</title> <meta http-equiv=Content-Type content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="style.css" media="screen" /> </head> <body> <?php if ($error_message) { print '<font color="red">'.$error_message.'</font>'; } ?> <form action="login.php" method="post"> ID:<input type="text" name="id"><br /> PASS:<input type="password" name="password"><br /> <input type="submit" name=login value="認証"> </form> </body> </html>

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

みんなの回答

回答No.2

たぶん、セキュリティ云々の前に誰もが突っ込むと思いますが、htmlspecialcharsはいらないですね。 かわりにmysql_real_escape_string通して、ID名でDBからそのIDのレコードだけSELECTしてください。 その方法だとユーザー数毎ループなので、無駄が多すぎます。 あとpostしてきたパスとIDにtrim通して空白排除してやる気遣いもほしいです。 セキュリティ面ですが、何重にも変換すれば安全てわけじゃないです。 sha1で変換するときにはsaltと一緒に変換してやりましょう。 $hashed_password = sha512($_POST['password'].'固定の秘密文字列'); こんな感じです。とりあえずそれ以上はあんまり意味がないです。 参考: http://blog.ohgaki.net/sha1a_sa_a_a_ma_ya_a_a_a_a_sa_ma_fa_a_ma http://blog.ohgaki.net/espcs_if_a_fa_ia_a_pa_e_oa_a_sa_da_ca_sa

hina_hina000
質問者

お礼

参考URL有難うございます こちらを参考に書き直ししてみます

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>セキュリティ面並びに不具合 セキュリティに関しては前提としてhttpsでやってないなら 所詮IDもパスワードもダダ漏れです 不具合についてはhtmlspecialcharsを使用していますが 画面に出力しないのであれば不要です 入力データの規則チェックがされていませんが どんな文字もつかえる仕様はいただけません なんらかのバリデートが必要でしょう それとざっとしか見ていませんが、POSTしたIDとパスワードを ユーザーデータベースへ問合せをする方法が変じゃないですか?

hina_hina000
質問者

お礼

ご指摘有難うございます 早速htmlspecialcharsを削除しました ユーザーデータベース問合せ方法についてはもう書き直してみます httpsについては頭になかったので、調べて対応しようと思います ありがとうございました

関連するQ&A

  • php sqlでログイン認証システムについてです。

    このようなソースを書いてログインシステムを書いています。 ここで接続はできたのですが、クエリーが失敗しましたと出てきます。 このソースをどのように修正すればよいのかアドバイスお願いできないでしょうか。よろしくお願いします。 <?php session_start(); $link = mysql_connect('localhost', 'root', 'root'); if (!$link) { die('接続失敗です。'.mysql_error()); } $db_selected = mysql_select_db('mydb', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } mysql_set_charset('utf8'); // エラーメッセージの初期化 $errorMessage = ""; // ログインボタンが押された場合 if (isset($_POST["login"])) { // 1.ユーザIDの入力チェック if (empty($_POST["userid"])) { $errorMessage = "ユーザIDが未入力です。"; } else if (empty($_POST["password"])) { $errorMessage = "パスワードが未入力です。"; } // 2.ユーザIDとパスワードが入力されていたら認証する if (!empty($_POST["userid"]) && !empty($_POST["password"])) { // mysqlへの接続 $mysqli = new mysqli($db['localhost'], $db['root'], $db['root']); if ($mysqli->connect_errno) { print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error); exit(); } // データベースの選択 $mysqli->select_db($db['mydb']); // 入力値のサニタイズ $userid = $mysqli->real_escape_string($_POST["userid"]); // クエリの実行 $query = "SELECT * FROM db_user WHERE name = '" . $userid . "'"; $result = $mysqli->query($query); if (!$result) { print('クエリーが失敗しました。' . $mysqli->error); $mysqli->close(); exit(); } while ($row = $result->fetch_assoc()) { // パスワード(暗号化済み)の取り出し $db_hashed_pwd = $row['password']; } // データベースの切断 $mysqli->close(); // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。 //if ($_POST["password"] == $pw) { if (password_verify($_POST["password"], $db_hashed_pwd)) { // 4.認証成功なら、セッションIDを新規に発行する session_regenerate_id(true); $_SESSION["USERID"] = $_POST["userid"]; header("Location: main.php"); exit; } else { // 認証失敗 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; } } else { // 未入力なら何もしない } } ?>

    • 締切済み
    • 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のif文について

    phpでログイン処理のif文を書いています。 nameとpasswordのフィールドが記入されているのかをチェックするif文を書いたのですが、機能してくれません。何かが間違っているのでしょうか。 何も入力しないor間違った情報を入力する ということをしてもログインが出来てしまいます。 どなたかテェックお願い致します。 <?php require('dbconnect.php'); session_start(); if ($_COOKIE['name'] != '') { $_POST['name'] = $_COOKIE['name']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); // ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('name', $_POST['name'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • phpでログイン時のIDチェック

    phpでIDとパスワードを入力してもらいそれをチェックしてログインするシステムを作っています。 普通にログインはできるのですがIDがsから始まりその後に数字が7桁来れば会員専用のメイン画面に移行し、それ以外のIDであれば普通のメイン画面に移行するプログラムを書きたいです。 例)IDがs1234567であれば会員用の画面、それ以外s1234,1234567,d1234567などのIDであれば違う画面に移行したいです。 自分が書いたコードはこのようになっておりこちらをどのように改良していけばこのようなプログラムが書けるか知りたいです。 どなたかご教授お願いします。 <?php require('dbconnect.php'); session_start(); if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); header('Location: group.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • 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のコードでうまく動かず困っています

    現在ある書籍でログイン機能の基礎を学んでいるのですが、エラーが出て困っています。 書籍内のコードや付属のサンプルファイルの物をいれたり確認したりするのですがエラーがでます。 エラー Fatal error: Call to a member function bindParam() on a non-object in C:\xampp\htdocs\tennis\login.php on line 15 (この15行目は〇の部分です) コード <?php session_start(); //セッション開始 if(isset($_SESSION['id'])){ //セッションにユーザーIDがある(ログインしている) header('Location:index.php'); }else if(isset($_POST['name']) && isset($_POST['password'])){ $dsn = 'mysql:host=localhost; dbname=tennis; charset=utf8'; $user ='tennisuser'; $password = 'password'; try{ $db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db->prepare("SELECT * FROM users WHERE name=:name AND password=:pass"); ○$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR); $stmt->bindParam(':pass', sha1($_POST['password']), PDO::PARAM_STR); //クエリ実行 $stmt->execute(); if($row = $stmt->fetch()){ //ユーザーが存在していたので、セッションにユーザーIDをセット $_SESSION['id'] = $row['id']; header('Location:index.php'); exit(); }else{ //1レコードも取得できなかった場合 //ユーザー名・パスワードは間違っている可能性があるのでもう一度ログインフォームを表示 header('Location:login.php'); exit(); } }catch(PDOException $e){ die('エラー:'.$e->getMessage()); } }else{ //ログインしていない場合はログインフォームを表示 ?> <html> ~省略~

    • ベストアンサー
    • PHP
  • php ログインフォーム作成

    サーバーはさくらインターネットのプレミアムプラン phpのバージョンは 5.2.12 データベースのバージョンはMySQL 5.1 です。 <?php //DB設定 $dbhost = 'mysql***.db.sakura.ne.jp'; $dbuser = 'test'; $dbpass = 'test'; $dbname = 'members'; $ok_flg = 0; $msg = ""; //DB接続 $link = mysql_connect($dbhost,$dbuser,$dbpass); //使用するDBを選択 $conn = mysql_select_db($dbname,$link); if (!$conn) { die('Connect Error (' . mysql_connect_errno() . ') ' . mysql_connect_error()); } if (count($_POST) != 0) { $sql = sprintf("SELECT * FROM member WHERE id=? AND password=?"); $result = mysql_query($sql); ---- この先がわかりません ---- ***************************************** ***************************************** ***************************************** ---- ここまでがわかりません ---- if ($count == 1) { $ok_flg = 1; } else { $msg = '<span style="color:#ff0000;">ユーザーIDまたはパスワードが違います。</span>'; } } if ($ok_flg == 0) { echo <<< EOL $msg <form method="post" action=""> ユーザーID: <input name="id" /> パスワード: <input name="password" type="password" /> <input type="submit" value="ログイン" /> </form> EOL; } else { session_start(); $_SESSION["login_flg"] = 1; header ("location: ./"); } // MySQLへの接続を閉じる mysql_close($link); ?> ********の場所で困っています。 この先はどのように記述したらよろしいでしょうか? お分かりの方がいらっしゃいましたらご教授いただければと思います。

    • ベストアンサー
    • PHP
  • PHP PCでログインできたのに、スマホから無理

    PCからは既存アカウントでログインできるのですが、スマホからログインできません。 もちろんスマホ用サイトにも同様のスクリプトを書いております。 PCでは、ブラウザ:Google Chrome スマホのOSは、Android4.3 です。 ログインスクリプトは下記のようなものです。ちなみにこのスクリプトはスマホ用の方です。 -------------------------------------------------------------------------------------------- <?php session_start(); //////////////////// // POST変数の取得 // //////////////////// $login_id = (isset($_POST['login_id']))? $_POST['login_id'] : ""; $password = (isset($_POST['password']))? $_POST['password'] : ""; /* var_dump($login_id); var_dump($password); exit; */ if($login_id!=="" and $password!==""){ //////////////////////// // データベースを検索 // //////////////////////// $con = mysql_connect("~", "~", "~"); mysql_select_db("LAA0471050-shopcart"); mysql_set_charset('utf8'); $sql = "SET NAMES utf-8"; mysql_query($sql); $sql = "SELECT * FROM member_profile;"; $result = mysql_query($sql, $con) or die(mysql_error()); $rowco = mysql_num_rows($result); for($i=0; $i<$rowco; $i++){ $row = mysql_fetch_row($result); // 取得された行に対応する配列を返し、内部のデータポインタを前に進める if($login_id===$row[4] && $password===$row[5]){ // IDとパスワードが両方一致していた場合 $_SESSION['login'] = 1; // ログイン状態にする // setcookie("id", $login_id, time()+60*60*24*365); // アカウント用のクッキーの有効期限は一年間 // setcookie("pass", $password, time()+60*60*24*365); $_SESSION['login_id'] = $login_id; // メールアドレス header("Location: mypage.php?login_id=$login_id"); }else{ // header("Location: login.php"); // echo 'error'; } } mysql_close($con); // データベースとの接続を解除する } ?> <!doctype html> <html> <head><title>ログインページ</title> <meta charset="utf-8"> <!-- ◆ スマートフォン用 --> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- jQuery本体--> <script type="text/javascript" src="./jquery/jquery-2.1.3.js"></script> <!-- スマホ用スタイルシート --> <link rel="stylesheet" href="./jquery/jquery.mobile-1.4.5.min.css" /> <!-- スマホ用JavaScript --> <script src="./jquery/jquery.mobile-1.4.5.min.js"></script> </head> <body bgcolor="#FFFFCC"> <br> <?php for($i=0; $i<60; $i++){ echo '&nbsp'; } if($_SESSION['login']!==1){ echo '<a href="membership_form.php"><img src="./images/shinki.png" border="0"></a>'; echo '&nbsp;<a href="login.php"><img src="./images/login.png" border="0"></a>'; }else{ // ログインしてれば echo '<a href="mypage.php"><img src="./images/mypage.png" border="0"></a>'; echo '&nbsp;<a href="logout.php"><img src="./images/logout.png" border="0"></a>'; } ?> <br><br> <?php ////////////// // 表の表示 // ////////////// echo '<center>'; echo '<table width="320" cellpadding="0" cellspacing="0" border="0">'; echo '<tr rowspan="10" width="320">'; // ⇐ このrowspan="14"で、⇒の画像などを幅寄せできる【重要】 echo '<form name="form1" method="post" action="login.php">'; echo '<tr><td><img src="./images/login_bar.png" width="100%"></td></tr>'; echo '<tr><td width="320" height="20" class="line1">ログインID(メールアドレス)</td></tr>'; echo '<tr>'; echo '<td width="320" height="20" align="middle">'; echo '<input type="text" class="yokohaba" name="login_id" id="login_id" size="75" tabindex="1">'; echo '</td>'; echo '</tr>'; echo '<td width="320" height="20" class="line1">パスワード</td>'; echo '</tr>'; echo '<tr>'; echo '<td width="320" height="20" align="middle">'; //echo '<input type="password" class="yokohaba" name="password" id="password" size="75" tabindex="2" value="'.$_COOKIE['pass'].'">'; echo '<input type="password" class="yokohaba" name="password" id="password" size="75" tabindex="2">'; echo '</td>'; echo '</tr>'; echo '<tr><td width="320" height="20" align="middle">'; echo '<a href="JavaScript:document.form1.submit()" onclick="location.href=\'login.php\'"><img src="./images/login_send.png" border="0" tabindex="3" width="100%"></a>'; echo '</td></tr>'; echo '</form>'; echo '</table>'; ?> <br><br> <center><a href="top.php">トップページ</a></center> </center> </body> </html> どこがどう間違っているのか、ご指導お願い致します。

    • 締切済み
    • PHP
  • 一つのphpファイルでログイン画面を作りたい

    一つのphpファイルでログイン画面を作りたい 一つのphpファイルでログイン画面→管理者画面 ログインエラー画面を作りたいと思っております。 下記のスクリプトで上手くセッションが保持できないので、 どなたかご教授ください。 宜しくお願いいたします。 -------------------------------------------- session_start(); //パスワードチェック $error_flag = 0; if(isset($_POST["login"])){ if($_POST["id"] == $login_id && $_POST["password"] == $login_pass){ $_SESSION["login"]["admin"] = 1; }else{ $error_flag = 1; } } if(isset($_SESSION["login"]["admin"]) && $_SESSION["login"]["admin"] == 1){ //管理者画面 }else{ //エラー画面 }

    • ベストアンサー
    • PHP
  • PHP初心者です。何処がエラーなのかさっぱり解りません。

    超初心者です。 PHPの勉強を始めたばかりで、いきなりつまずいています。 下記の表示になりエラーになっているのですが、何処がエラーなのか意味が解りません。 Parse error: syntax error, unexpected $end in C:\xampp\htdocs\phplesson\03\login.php on line 31 どなたか教えてください。 よろしくお願いします。 ----------------- <?php session_start(); $error_message = ""; //ログインボタンが押されたかを判定 if (isset($_POST["login"])) { if ($_POST["member_name"] == "php" && $_POST["password"] == "password") { //ログインが成功した証拠をセッションに保持 $_SESSION["login_name"] = $_POST["member_name"]; //管理者専用画面へWebブラウザをリダイレクトさせる $login_url = "http://{$_SERVER["HTTP_HOST"]}/phplesson/03/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message ="メンバー名かパスワードを間違えています。"; } ?> <html> <body> <?php if ($error_message) { print '<font color="red">' .$error_message. '</font>'; } ?> <form action="/phplesson/03/login.php" method="post"> メンバー名:<input type="text" name="member_name" value="" /><br /> パスワード:<input type="password" name="password" value="" /><br /> <input type="submit" name="login" value="ログイン" /> </form> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう