2017-01-04 13 views
0

adminまたはお客様がにログインしているかどうかを確認するコードがありますが、解決できない問題が1つあります。 顧客のアカウントを使用してログインします。たとえば、顧客のログインページにアクセスするために顧客のユーザー名としてredhoodを使用します。しかし、管理者のアカウントを使用して、たとえば管理者のユーザー名としてwolfpackを使用すると、adminログインページではなく顧客のログインページにリダイレクトされます。しかし、私はどちらがのPHPコード私は変更する必要がありますかわからない。誰でもこの問題を解決できますか?ありがとう!管理者とお客様のログインはPHPで

MySQLデータベース:

enter image description here

Signin.html

<!DOCTYPE html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" href="css/signin/signin_desktop.css"> 
<link rel="stylesheet" type="text/css" href="css/signin/signin_tablet.css" media="screen and (max-width:768px)"> 
<link rel="stylesheet" type="text/css" href="css/signin/signin_mobile.css" media="screen and (max-width:480px)"> 

</head> 


<body> 

<div id="wrapper"> 

<header> 

<nav id="mainMenu"> 
    <img src="logo/logo.png" id="logo"> 
    <ul> 
    <li><a href="home.html">Home</a></li> 
    <li><a href="about.html">About</a></li> 
    <li><a href="rates.html">Booking Rates</a></li> 
    <li><a href="facilities.html">Recreation</a></li> 
    </ul> 
</nav> 

</header> 


<section id="banner"> 

    <div id="ritu" class="shadow"> 
     <img src="images/content_pure.jpg"> 
     <img src="images/Sports-Hub-Gym.jpg"> 
     <img src="images/gym.jpg"> 
     <img src="images/ClubFitt2jpg.jpg"> 
    </div> 
</section> 


<section id="content"> 

<div id="sign"> 
    <div class="user"> 
     <h2>Existing User</h2> 

     <form action="checkuser.php" method="post"> 
     <p style="color:white;">Username:</p> 
     <input type="text" name="uname" size="25" maxlength="20" placeholder="Please enter your username" required><br><br> 
     <p style="color:white;">Password:</p> 
     <input type="password" name="pword" size="25" maxlength="20" placeholder="Please enter your password" pattern=".{6,}" required><br><br> 
     <input type="submit" name="loginbtn" value=""> 
     </form> 

     <?php 

     if(isset($_GET['uname']) && isset($_GET['pword'])) 
     { 
      echo "<script>alert('Invalid Username and Password.')</script>"; 
     } 
     ?> 

    </div> 

    <div class="user"> 
     <h2>New User</h2> 

     <a href="createacc.html"><img id="create" src="button/CREATE%20ACCOUNT.png"></a> 

     <p style="color:white;">Ads:</p> 

     <div id="ads"> 
     <div class="row"> 
      <div class="image"> 
       <img id="minilogo" src="logo/logo.png"> 
       <div id="advt"> 
        Download Now 
       </div> 
      </div> 

      <div class="image"> 
       <img id="apps" src="images/myActiveSG%20APP.jpg"> 
      </div> 
     </div> 


     </div> 
    </div> 

</div> 


</section> 


<footer> 

<p>© Copyright 2016 SportLab. All Rights Reserved.</p> 
<nav id="submenu"> 
    <ul> 
     <li><a href="#">Sitemap &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| </a></li> 
     <li><a href="contact.html">&nbsp;&nbsp;&nbsp;Contact &nbsp;&nbsp;&nbsp;&nbsp;|</a></li> 
     <li><a href="term.html">Term of Use </a></li> 
     <li><a href="privacy.html">| &nbsp;&nbsp;&nbsp;&nbsp;Privacy </a></li> 
    </ul> 
</nav> 


</footer> 

</div> 

</body> 
</html> 

PHP

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Check Login</title> 
</head> 

<body> 
<?php 


if(isset($_POST["loginbtn"])) 
{ 
     $u=$_POST['uname']; 
     $p=$_POST['pword']; 

     $conn=mysqli_connect("localhost", "root", "" , "M3_156020K_Syahri_SportFacility"); 
     $sql = "SELECT * FROM create_user WHERE username='" .$u. "' AND password='" .$p. "' "; 
     $search_result=mysqli_query($conn, $sql); 

     $userfound=mysqli_num_rows($search_result); 

     if($userfound >= 1) 
     { 
      session_start(); 
      $_SESSION['MM_Username']= $u; 

      $row=mysql_fetch_assoc($search_result); 

      if($row['role'] == 1) 
      { 
       header("Location: login_admin.html"); 
      } 
      else 
      { 
       header("Location: login_cust.html"); 
      } 
     } 
     else 
     { 
      header("Location: signin.html?uname=" . $u . "&pword=" . $p); 
     } 



    mysqli_close($conn); 

} 

?> 
+0

[otp-thing by microvb](https://github.com/microvb/otp-thing)のようなすべてのACL問題を処理するフレームワークの使用を検討しましたか?また、あなたのコードで目立った問題は、セッションを初期化していて、既に出力を送信した後でその値を変更しようとしているかどうかです。 –

+3

よく似たテキストのパスワード...悪い考え... PHPは['password_hash()'](http://php.net/manual/en/function.password-hash.php) と['password_verify()' ](http://php.net/manual/en/function.password-verify.php)それらを使用してください。 次に、[パスワードに関する良いアイデア](https://www.owasp.org/index)を紹介します。php/Password_Storage_Cheat_Sheet) 5.5より前のバージョンのPHPを使用している場合は(互換性パックがあります)(https://github.com/ircmaxell/password_compat) – RiggsFolly

+2

@RiggsFolly - 出力を送信した後にセッションを初期化しようとしています。ポストからの直接入力がSQLクエリに渡されるようにし、ユーザーを明らかにしてリダイレクトを渡します。ユーザーのサーバー側(.html)などを検証できないページにリダイレクトするなど。それで、なぜ私はotp-thingを推奨しました。なぜなら、それは役割を含む厄介なセキュリティのすべてを処理するからです。 –

答えて

2

あなたが訂正しなければならないことの一つは、あなたがセッションの作業を終えるまで出力を送らないことです。また、Rafaelと記載されているように、フィールドが実際の値ではなく、フィールドが1であるかどうかを確認します。 (が準備された文使用するには、この例更新)ので、のようなあなたの条件の後にHTMLブロックを移動たとえば

、:一日の終わりに

<?php 
if(isset($_POST["loginbtn"])) { 
    $u=$_POST['uname']; 
    $p=$_POST['pword']; 

    $conn=new mysqli("localhost", "root", "" , "M3_156020K_Syahri_SportFacility"); 
    $sql = "SELECT `role` FROM create_user WHERE username=? AND password=?"; 
    $stmt = $conn->prepare($sql); 
    $stmt->bind_param('ss', $u, $p); 
    $stmt->execute(); 
    $stmt->bind_result($role); 
    $stmt->close(); 
    $conn->close(); 
    if($role) { 
     session_start(); 
     $_SESSION['MM_Username']= $u; 
     if($role == 'Admin') { 
      header("Location: login_admin.html"); 
     } else { 
      header("Location: login_cust.html"); 
     } 
    } else { 
     header("Location: signin.html?uname=" . $u . "&pword=" . $p); 
    } 
    mysqli_close($conn); 
} 
?><!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Check Login</title> 
</head> 

<body> 

は、私は真剣に自分自身を書いて再考するだろう明白なセキュリティホールにはっきりと注意が払われていないことを考えると、最初からログインシステムを導入する必要があります。私はotp-thingのようなパッケージを購入するか、Laravel/etcのようなポータル全体を自分で書く必要がある場合は、パッケージをお勧めします。

+1

このことは、まともな人がサーバに置くという形で、長い、長い道のりです。これらのSQLインジェクションホールは大きな問題です。あなたが助けようとしていることは分かっていますが、それらを無視することは、心臓発作に苦しむ患者に鎮痛剤を与えることと同じです。 – tadman

+0

@tadman - 私は同意しますが、コードを書き直すのはここにはありません。あなたが気づいたら、私はまた、現在のログインシステムの試みを置き換えるソリューションを提案しました。これは、より徹底的で、元々のコードでの過度の危険性をカバーしています。この「解決策」は、単に要求された問題に対処することであった。 –

+0

注入口を固定することは、さらに2行のコードのようになり、実際に誰かに缶詰の危険な「解決策」を渡すのではなく、教育に役立ちます。インジェクションのバグや、自分自身の厄介なログインシステムを書く人たちは、PHPの世界で深刻な問題となっています。 – tadman

1

別にコード他のセキュリティ上の問題から、あなたの質問に答えるために、述べてきた... あなたの条件は間違っている:

if($row['role'] == 1)は役割があるあなたのケースではif ($row['role'] == "Admin")

に変更する必要がありますnever1となり、常にelseの条件になり、login_cust.htmlに送信されます。

データベースの役割は、UserAdminです。条件を変更します。

+0

それも真実です。出力後にセッションを開始する最初の問題に焦点を当てて見落としました。 –

関連する問題