ホームページ  >  記事  >  バックエンド開発  >  これら 2 つのログイン認証方法の何が問題なのでしょうか?

これら 2 つのログイン認証方法の何が問題なのでしょうか?

WBOY
WBOYオリジナル
2016-06-13 13:36:27795ブラウズ

これら 2 つのログイン検証方法の何が問題か
最初の方法:

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><?php
$id=$_POST['id'];
$password=$_POST['password'];
 $conn=mysql_connect("localhost","root","root");
 if (!$conn){
 die("连接失败:".mysql_errno());
 }
 mysql_select_db("emp",$conn) or die(mysql_errno());
 mysql_query("set names utf8")or die(mysql_errno());
$sql = "select count(id) from admin where id='".$id."' and password='".md5($password)."'";
$res = mysql_query($sql,$conn);
$num = mysql_num_rows($res);
if($num){
   header("location:empManage.php");
   exit();
}else{
  header("location:login.php?errno=1");
  exit();
}
mysql_free_result($res);
mysql_close($conn);
 
?>

この方法では、パスワードがデータベースと一致するかどうかに関係なくログインできます
方法 2:
PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><?php
$id=$_POST['id'];
$password=$_POST['password'];
 $conn=mysql_connect("localhost","root","root");
 if (!$conn){
 die("连接失败:".mysql_errno());
 }
 mysql_select_db("emp",$conn) or die(mysql_errno());
 mysql_query("set names utf8")or die(mysql_errno());
 $sql="select password from admin where id=$id";
 $res=mysql_query($sql,$conn);
 if ($row=mysql_fetch_assoc($res)){
     
 if ($row['password']==md5($password)){
 header("location:empManage.php");

 }
 }
header("location:login.php?errno=1");

mysql_free_result($res);
mysql_close($conn);
?>

この方法では ID とパスワードが正しい場合でもログインできません

何が間違っているのか、なぜそうなるのかアドバイスをお願いしますログインできません

------解決策---------
2つ目があるのを忘れていました1つ。
私が考える論理的な質問
if ($row=mysql_fetch_assoc($res)){
if ($row['password']==md5($password)){
header("location :empManage.php");
}
}
header("location:login.php?errno=1");

成功した場合、最初の header("location:empManage. php") ですが、header("location:login.php?errno=1") は最終的にも実行されます。 header() 関数は実行直後にメッセージ ヘッダーをブラウザに送信しないため、後のヘッダーが前のヘッダーを上書きします。しかし、私はそれをテストしていないので、それを保証することはできません。
ロジックを整理して見てみましょう

if ($row=mysql_fetch_assoc($res)){
if ($row['password']==md5($password)) {
header("location:empManage.php");
exit();
}
}
header("location:login.php?errno=1");
------解決策---------
$num = mysql_num_rows($res);
if($num){
header("location:empManage.php");
これは間違っています。カウント値を読み取り、カウントが 1 かどうかを判断する必要があります
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。