アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

【追記】


念のためですが、以下の事も試してみてください。

prit_r($_POST);

これは些細な事ですが、フォームからきちんと値が送られてきているかも疑問視できるからです。
私が良くやってしまうのは、単純にテキストのname属性が違っていたり同じ名前を入れていたりなど、案外些細な事でミスをしていたりするものですので。
    • good
    • 0
この回答へのお礼

maenet1972さんわざわざ調べていただき
真に申し訳ないです。
ありがとうございます。
やっと原因がわかりました。
というかお恥ずかしいイージーミスでした。

提案いたただいた事をやり、
NOとでて、prit_r($_POST);でやると
違うパスワードが表示しました。

そのあと、name属性など見ましたが、あっていました。
なので、登録時に問題があるとかもしれないと思い
登録phpをみると
$sql="insert into users(passwd)values('".md5($_POST["login"])."')";となっていました
なのでいままで、パスワード入力したと思っていたのは
md5したログインIDでした。(ハッシュしていなかったらすぐわかった問題なのですが笑)

なので、パスワードとログインIDがいっしょでないと
ログインできなかったようです。

maenet1972さんいままで親身にお付き合いいただき
真にありがとうございました。とても感謝しております。
イージーミスで情けないのですが、これからもがんばりたいとおもいます。
ほんとうにありがとうございました。

お礼日時:2008/05/08 21:56

実際に私もやってみたのですが、md5($_POST["passwd"])の部分は特におかしな感じはしなかったですね。


----試しに"password"の文字をmd5でハッシュしてみました
<?
if($_POST['mode']=="md"){
$a="5f4dcc3b5aa765d61d8327deb882cf99";//passwordをmd5でハッシュ
if($a==md5($_POST['passwd'])){
echo "yes";
}else{
echo "NO";
}
}
?>
フォームから“password”の文字を入力して送信しても“yes”と表示されましたので、
md5($_POST['passwd'])は問題なく処理されているようです。
だとすると、逆に
if(md5($_POST["passwd"])=="13048e751550789e7bc0e0a0444bbbd5"){
でもfalseが返れば、
POSTデータのmd5と"13048e751550789e7bc0e0a0444bbbd5"は
根本的に違う事になりますが、こちらは試されましたでしょうか?
    • good
    • 0

あ~なるほど、ログインIDがphpならパスワードもphpでないとログインできないという事ですね。


だとすると、単純にDBに保存されているログインIDとパスワードが同じものになってしまっているという事ではないんですかね(^^;
ログインできているという事は、DBからきちんと取得出来ている証拠ですし、、、。

原因究明として再評価と言いましたが、まずDBの中身を調べてみてはどうでしょうか?

この回答への補足

maenet1972さんお返事ありがとうございます。

DBをみてログインIDとパスワードが同じにはなっているのですが、
そうしないとログインできないので、

DBからきちんと取得出来ているかをもう一度検証したところ
(こんどはログインIDとパスワードは違う言葉です)
$users=mysql_fetch_array($result);の部分で
print_r($users["passwd"]);としたらちゃんとパスワードが
表示されました。

if($users["passwd"]==md5($_POST["passwd"])){
print_r($users["passwd"]);
とやると表示されませんでした。
ここが原因であることがわかりました。
ためしに、
md5($_POST["passwd"])部分を実際登録してあるmd5のパスワード
を"13048e751550789e7bc0e0a0444bbbd5"と入力すると
if($users["passwd"]=="13048e751550789e7bc0e0a0444bbbd5"){

ログインIDとパスワードが違ってもログインできました。
なので問題が
1.ログインIDとパスワードが同じでないとログインできない。
2.ログインIDとパスワードが違うときは、md5パスワード直接入力しないとログインできない。
md5($_POST["passwd"])が悪さしているのがわかるのですが
特別間違っているようには見えないので困りました。

補足日時:2008/05/07 21:25
    • good
    • 0

POSTされたログイン名がphpだろうがabeだろうが、パスワードがabeならログインできてしまうという事ですか?


あくまでもこれは憶測なのですが、最初のrequire("config.php");の
config.phpの中身が何か悪さしているとか、、、
例えば、パスワードチェック「$users["passwd"]==md5($_POST["passwd"])){」の前にログインIDの中身を再評価させて処理させるとかしてみてはどうでしょうか?

この回答への補足

maenet1972さんありがとうございます。
abeでログインできるのではなく、
ログインIDがパスワード一致の場合だけ何故かログインできてしまって
IDがphpならパスワードphpにするとログインできてしまうのです
(それ以外はログインできませんでしたっとなってしまいます)
ID、パスワードの言葉はなんでもよくて、ただID、パスワードに両方とも同じ言葉が入っていないとログインできないということです。
説明がヘタで申し訳ないです。

config.phpの内容は、DBにコンタクトする事、キャラクターをutf8で送信する事、あとサイトのURLが書いてあるだけです。

すみません
再評価とは($users["login_id"]])==($_POST["login_id"])
みたいなことをやってみるればいいんでしょうか?

補足日時:2008/05/07 15:15
    • good
    • 0

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