md5の認証が通らない

このQ&Aのポイント
  • ログイン認証の際、入力したパスワードとデータベースのユーザーパスワードをmd5でハッシュ化し比較しています。
  • しかし、同じ文字列にも関わらず認証が通らない問題が発生しています。
  • 原因を特定するために、各変数の値と条件の一致を確認する手順を踏んでください。
回答を見る
  • ベストアンサー

md5の認証が通らない

PHP 5.1.6 MySQL 5.0.77 で開発しています。 ログインの処理で以下のコードを書いています。 入力したパスワードをサーバに送っているところです。 print $row["user_password"] . "<br />"; $entry_password = mysql_real_escape_string(trim($_POST['password'])); $crypted_password = hash('md5',$entry_password) ; print "crypted_passwordは " . $crypted_password . "<br />"; // 認証OK? //ハッシュ化後の処理 if ( $_POST["mode"] == "login" && mysql_num_rows($res) > 0 && $crypted_password == $row["user_password"] ) { $_SESSION["userid"] = $row["user_id"]; header("Location: top.php"); } ?> $row["user_password"] はデータベース内に格納してあるユーザーパスワードで 既に「md5」でハッシュ化されて格納されています。 利用者が入力したパスワードを「$_POST['password'」でサーバに送り、 同じく「md5」でハッシュ化して「$crypted_password」としています。 ここからが問題ですが、 「$_POST['password'」も「$crypted_password」もまったく同じわけのわからない 同じ32文字のテキストですが、(「print」で目視確認しています。) 何回やっても認証が通りません。 目視した限りではまったく同じ文字列です。 $_POST["mode"]が「"login"」になっているのも確認しました。 「mysql_num_rows($res) > 0」は $row["user_password"] が帰ってきているので 間違いありません。 どこに原因があるのでしょうか。 お分かりの方、教えて下さい。

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

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

認証が通らないというのはtop.phpにリダイレクトしないということで判断されているのでしょうか printしたあとではheader( )は無効になるので提示されたプログラムは動作しません print文をすべて削除してください

panasobi
質問者

お礼

早速の回答ありがとうございました。 print文 を外したら問題なく処理できました。 何故かはわからないのですが、以後気をつけようと思います。 ほんとにありがとうございました。

関連する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
  • MD5ハッシュのデータが

    <? include "config.php"; $Data = '<form action=register.php method=post> Login: <br><input type=text name=login><br><br> Password:<br><input type=password name=passwd><br><br> Repeat password:<br><input type=password name=repasswd><br><br> Email:<br><input type=text name=email><br><br> <input type=submit name=submit value="Registration"> </form>'; if (isset($_POST['login'])) { $Link = MySQL_Connect($DBHost, $DBUser, $DBPassword) or die ("Can't connect to MySQL"); MySQL_Select_Db($DBName, $Link) or die ("Database ".$DBName." do not exists."); $Login = $_POST['login']; $Pass = $_POST['passwd']; $Repass = $_POST['repasswd']; $Email = $_POST['email']; $Login = StrToLower(Trim($Login)); $Pass = StrToLower(Trim($Pass)); $Repass = StrToLower(Trim($Repass)); $Email = Trim($Email); if (empty($Login) || empty($Pass) || empty($Repass) || empty($Email)) { echo "All fields is empty."; } elseif (ereg("[^0-9a-zA-Z_-]", $Login, $Txt)) { echo "Login have a incorrect format."; } elseif (ereg("[^0-9a-zA-Z_-]", $Pass, $Txt)) { echo "Password have a incorrect format."; } elseif (ereg("[^0-9a-zA-Z_-]", $Repass, $Txt)) { echo "Repeat password have a incorrect format."; } elseif (StrPos('\'', $Email)) { echo "Email have a incorrect format."; } else { $Result = MySQL_Query("SELECT name FROM users WHERE name='$Login'") or ("Can't execute query."); if (MySQL_Num_Rows($Result)) { echo "Account <b>".$Login."</b> is exists"; } elseif ((StrLen($Login) < 4) or (StrLen($Login) > 10)) { echo "Login must have more 4 and not more 10 symbols."; } elseif ((StrLen($Pass) < 4) or (StrLen($Pass) > 10)) { echo "Password must have more 4 and not more 10 symbols."; } elseif ((StrLen($Repass) < 4) or (StrLen($Repass) > 10)) { echo "Repeat password must have more 4 and not more 10 symbols."; } elseif ((StrLen($Email) < 4) or (StrLen($Email) > 25)) { echo "Email must have more 4 and not more 25 symbols."; } elseif ($Pass != $Repass){ echo "Password mismatch."; } else { $Salt = $Login.$Pass; $Salt = md5($Salt); $Salt = "0x".$Salt; MySQL_Query("call adduser('$Login', $Salt, '0', '0', '0', '0', '$Email', '0', '0', '0', '0', '0', '0', '0', '', '', $Salt)") or die ("Can't execute query."); echo "Account <b>".$Login."</b> has been registered."; } } } echo $Data; ?> 上のスクリプトで登録をしてphpmyadminで登録されたデータを見ると、 パスワードが空になっていたり文字が化けた1文字とかになって書き込まれています。 PHP上で何か問題があるのかと <?php $str = 'test'; if (md5($str) === '098f6bcd4621d373cade4e832627b4f6'){ eco "MD5OK"; exit; } ?> のように書いてみると正常にMD5OKと出ますのでデータベース側に問題があるような気がします。 どうしたら正常に書き込まれるようになるか分かる方いらっしゃいませんでしょうか?

    • ベストアンサー
    • MySQL
  • PHP+mySQL認証画面

    サーバーの引っ越しで新しいサーバーにてプログラムの動作確認を行っています。 管理者パネルに入るのに、PHPで作成した認証プログラムでログインしようとすると、入力しても何度も聞いてきて入れません。 旧 MySQL5.0.22   phpMyAdmin2.8.2.4 新 MySQL5.1.69 phpMyAdmin3.5.8.1  IDとパスワードはデータベースで設定。 管理者パネルで変更できるようになっている。 $sv = "**"; $dbname = "**"; $user = "**"; $pass = "**"; ログイン認証 //データベースに接続する $conn = mysql_connect($sv,$user,$pass) or die("接続エラー"); mysql_select_db($dbname) or die("データーベース接続エラー"); $sql = "SELECT id, pass FROM pass_t WHERE pno=1"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $db_user_id=$row['id']; $db_password=$row['pass']; } if(!isset($_SERVER["PHP_AUTH_USER"]) || $_SERVER["PHP_AUTH_USER"] != "$db_user_id" || $_SERVER["PHP_AUTH_PW"] != "$db_password") { header("WWW-Authenticate: Basic realm=\"login\""); header('HTTP/1.0 401 Unauthorized'); echo "ユーザー名またはパスワードが間違っています。<br>"; echo "もう一度はじめからやり直してください。"; exit; } 細々変えて試してみましたが駄目でした。 まだまだわからないことだらけの初心者なので、どうにもならずで 解決策がありましたらぜひ教えて頂けますと幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • MySQLにmd5が登録できません。

    md5を使ってパスワードをハッシュ化したものをPHPからMySQLに登録したいのですが、エラーが出てしまい登録できません。 データベースの質問になるのかもしれませんが、PHPで開発しているので一応こちらで質問させていただきます。 MySQL:バージョン 5.0.41 PHP:バージョン 5.1.6 参考文献:PHPEC PHPによるECサイトプログラミング~ショッピングカートから決済まで(著:大角清美) 【PHPからの挿入文】 $sql = "insert into users (     s_login_id,     s_password,     s_register_date,     s_birthday,     s_email1,     s_postal_code,     ) values (     '".mysql_real_escape_string($_POST['s_email1'])."',     '".md5($_POST['s_password'])."',     '".date('Y-m-d H:i:s')."',     '".mysql_real_escape_string($_POST['s_year'].'_'. $_POST['s_month'] .'_'. $_POST['s_day'] . '00:00:00') ."',     '".mysql_real_escape_string($_POST['s_email1'])."',     '".mysql_real_escape_string($_POST['s_postal1'] .$_POST['s_postal2'])."', )"; 【MySQLに直接命令を打ち込んだ時のエラー文】 ERROR 1064 (42000):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's_email1'])."', '".md5($_POST['s_password'])."', '".date('Y-m-d H:i:s')."', ' at line 16 練習としてショッピングサイトを作ってみようと本を見ながら練習している最中なのですが、近くに質問できる相手がいなくて困っております。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ログイン認証で

    ログイン認証で <? session_start(); $con=mysql_connect(localhost,***,***); mysql_select_db("***"); $passwd=addslashes($_POST['passwd']); $email=addslashes($_POST['email']); $name=addslashes($_POST['name']); $sql="select * from users where email='{$_POST['email']}' and passwd='{$_POST['passwd']}'"; $_session['name']=$name; $rs=mysql_query($sql); if(mysql_num_rows($rs)>0){ $_session['login']=1; header('location:'. "top.php"); exit; } mysql_close($con); ?> <html> <head> <title> </title> </head> 認証失敗 <br> <a href="login.php"> 戻る</a> <body> と入力したのですが、 emailとpasswdに合ったnameを違うページに表示したいのに、それができないんです・・・ ようこそ<? $_SESSION['name']?> さん<br> どこかおかしなところありますか?

    • ベストアンサー
    • PHP
  • ハッシュ値のパスワードMYSQL検索で一致しない

    PHPでMYSQLにハッシュ値にしたパスワードを登録して、同じハッシュ値で検索を行いましたが、どうしても検索結果で一致しません。 パスワードの文字列をMD5を使ってハッシュ値に変換して次のようにMYSQLに登録しました。 $email = htmlspecialchars($_POST["email"]); $user_name = htmlspecialchars($_POST["user_name"]); $password = md5(htmlspecialchars($_POST["password"])); $sql = 'INSERT INTO user_tbl (email,user_name,password) VALUES ( "' . $email . '","' . $user_name . '","' . $password . '" )'; $sth = $dd->prepare($sql); $sth->execute( array() ); $qid = $dd->lastInsertId(); ※user_tblの定義のこんな感じにしてあります。 CREATE TABLE user_tbl ( email varchar(50) NOT NULL, user_name varchar(20) NOT NULL, password VARCHAR(50) NOT NULL ); 検索する処理でSQL等は次のように処理しましたが、検索結果がゼロ件でした。 $email = htmlspecialchars($_POST["email"]); $beforepass = md5(htmlspecialchars($_POST["beforepass"])); $afterpass = md5(htmlspecialchars($_POST["afterpass"])); $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"'; $q = $dd->prepare( $sql ); $q->execute(); if($q->fetchColumn() == 1){ //ここでパスワードが一致した場合の処理を書く } そこで次の2パターンのようにSQL文を少し変えてみたらそれぞれの検索結果が1件でした。 $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '"'; $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and user_name = "tanaka"'; (MYSQLのuser_tblのuser_nameには'tanaka'と入っている状態で実行したものです) SQLに渡される各変数には文字列が代入済みであることが確認できています。 MD5でハッシュ化した文字列同士を比較してどうして検索結果が一致しないのでしょうか? ちなみに検索したいパスワードのハッシュ値とDBに格納されているパスワードのハッシュ値を目で比較したら一致していました。 以上です。 ハッシュ値を検索条件に入れる場合に特殊な事をするのでしょうか? ヒントだけでもよいので教えて下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.1(API 16) PHP 5

    • ベストアンサー
    • PHP
  • MD5化したパスワードを再度パスワード認証する

    説明下手かもしれませんが、MD5化したパスワードを再度パスワード認証する方法で躓いてしまいました。 test.php $passwd = 'admin'; $passwd = md5($passwd); if(!isset($password)){$password = md5($_post('password')) ;} if($password == $passwd)){ //ファイルへ書き込み、ファイル一覧表示する処理(コード省略) //★★ 処理した後に、この下でコードでパスワード認証されたPOST送信ボタンを出力 ★★ echo "<td> <form action=$PHP_SELF method=post> <input type=hidden name=password value=$passwd> <input type=submit value=送信> </form>"; } 問題は (1)$passwdはMD5で暗号化されている (2)POST送信された$passwdはMD5で暗号化されたものが、md5($_post('password')で更にMD5化されて認証エラーになる。 なのでフォームボタン(POST送信)を使用し、自身のスクリプトに認証されるような処理を行いたいのですが、 いい方法をアドバイス下さい。 echo "<td> <form action=$PHP_SELF method=post> <input type=hidden name=password value=$passwd> <input type=submit value=送信> </form>";

    • ベストアンサー
    • PHP
  • 簡単なif文でちゃんと分岐しません

    今参考書を見ながらやっていますがうまくいきません。 postからusernameとpasswordの値を受け取って処理する スクリプトなんですが、うまく作動してくれません。 ■問題点 分岐点が4箇所ありますが、 パスワードだけ間違っても、すべて■1■ ログイン処理状態になります。 どうしてもパスワード再設定の画面に切り替わりません。 入力されたデータはデータベースにきちんと入ります。 3日間これで悩んでいて、ついに投稿してみました。 こんなこともわからない私ですが なんとかお願い致します。 ----ここから---- <?php session_start(); $username = $_POST["username"]; $sql = "SELECT * FROM `art_users` WHERE `user_name` = '%{$username}%'"; $query = mysql_query($sql) or die("データ追加エラー" . mysql_error()); $record = mysql_fetch_array($query, MYSQL_ASSOC); if ( $_POST["mode"] == "login" && mysql_num_rows($query) > 0 && $_POST["password"] == $record["user_password"] ) { $_SESSION["userid"] = $record["user_id"]; header("Location: kaukau_top.php"); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ログイン処理</title> </head> <body> <?php // ■1■ ログイン処理状態 if ( $_POST["mode"] == "login" ) { // 新規登録:クエリ実行結果が0行=既存ユーザー名と一致しない if ( mysql_num_rows($query) == 0 ) { echo '新規ユーザー登録<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="mode" value="register">'; echo '<input type="submit" value="登録">'; echo '</form>'; } // パスワードミス:クエリ実行結果のパスワードと入力されたパスワードが一致しない elseif ( $_POST["password"] != $record["user_password"] ) { echo 'パスワードが違います。<br>'; echo 'ひみつの質問に答えると、パスワードを変更できます。<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="resetpassword">'; echo '<input type="submit" value="送信">'; echo '</form>'; } } // ■2■ パスワード再設定状態 elseif ( $_POST["mode"] == "resetpassword" ) { if( $record["user_answer"] == $_POST["answer"] ) { echo 'パスワード再設定<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="modifypassword">'; echo '<input type="submit" value="登録">'; echo '</form>'; } else{ echo "ひみつの答えが違います"; } } // ■3■ 新規ユーザー登録状態 elseif ( $_POST["mode"] == "register" ) { if( $_POST["password"] == $_POST["confirm"] ) { $sql = "INSERT INTO users (user_name, user_password, user_question, user_answer) VALUES ("; $sql .= " '" . $_POST["username"] ."',"; $sql .= " '" . $_POST["password"] ."',"; $sql .= " '" . $_POST["question"] ."',"; $sql .= " '" . $_POST["answer"] ."')"; $result = mysql_query($sql); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } // ■4■ パスワード変更状態 elseif ( $_POST["mode"] == "modifypassword" ) { if ( $_POST["password"] == $_POST["confirm"] ) { $sql = "UPDATE users"; $sql .= " SET user_password = '" . $_POST["password"] . "'"; $sql .= " WHERE user_name = '" . $_POST["username"] . "'"; mysql_query( $db, $sql ); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } ?> </body> </html>

    • 締切済み
    • PHP
  • IDとパスワードを認証すコードをかきましたが動きません

    phpの超初心者です、よろしくお願いします。 IDとパスワードを認証すコードをかきましたが動きません。 Formから別に使ったdbにあるIDとパスを見に行くコードでが、 dbにあるIDとパスと同じものを打ち込んでも認証しません、 また別のdbにあるIDとパスを打ち込んでも認証するときがあります。 一体どこが悪いのでしょうか。どこが悪いのかさっぱり分かりません。 よろしくお願いします。 --------------------------------------- <?php $conn = mysql_connect(localhost, "root", ""); //DBにコネクト mysql_select_db('login_test', $conn); //'login_test'をselect mysql_query('SET NAMES utf8'); //defalt $res_init=mysql_query('SELECT * from user'); //userからすべてのdataを取得 while($arr = mysql_fetch_assoc($res_init)){ //結果セットが無くなるまでループ foreach($arr as $k => $v){ echo "フィールド ".$k." の値は ".$v; echo "<br />"; } echo "<br />"; } //formからDATAを取得 $id=$_POST['input_ID']; $pass=$_POST['input_pass']; print("入力したid= ".$id." 入力したpass= ".$pass); //認証check if(auth ($id,$pass,$conn)===true){ print("認証成功"); } else{ print("認証不成功"); } //function function auth ($id,$pass,$conn){ $sql = "SELECT * from user WHERE user_id = $id AND password = '$pass'"; $res = mysql_query($sql, $conn); return $res; } ?> <form action="http://localhost/test/test.php" method="POST"> IDの入力:<input type="text" name="input_ID"><br /><br /> Passの入力:<input type="text" name="input_pass"><br /><br /> <input type="submit" name="delete_submit" value="送信"><br /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • Pythonでのスクレイピング

    あるサイト(https://gemforex.com/login.php) のログイン後の情報をPythonで抜き出したいのですが 以下のソースコードだとログインができていないようです。 何が悪いのでしょうか? import requests email = "メールアドレス" password = "パスワード" session = requests.session() login_info = { "mail":email, "passwd":password, } url_login = "https://gemforex.com/login.php" res = session.post(url_login, data=login_info) print(res.text)