2015-11-07 4 views
0

Моя страница входа для будущих пользователей позволяет использовать любое имя пользователя и пароль. Этот код находится в файле Login.php и должен направить вас на Account.php. Но он забирает вас туда, независимо от того, что вы вводите в формы.Ошибка сценария входа в базу данных PHP

<?php 
require 'Connections/Connections.php'; 
include('header.php'); 
?> 

<?php 

if(isset($_POST['Login'])){ 

    $UN= $_POST['Username']; 
    $PW = $_POST['Password']; 

    $result = $con->query("Select * from users where Username='$UN' AND Password='$PW'"); 

    $row = $result->fetch_array(MYSQLI_BOTH); 

    $_SESSION["UserID"] = $row['UserID']; 

    header('Location: Account.php'); 
} 
?> 

<!doctype html> 
<html> 
<head> 
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> 
    <link href="style/UserStyle.css" rel="stylesheet" type="text/css" /> 
    <title>Register</title> 
</head> 

<body> 
    <form action="" method="post" name="LoginForm" id="LoginForm"> 

     <div class="FormElement"> 
      <input name="Username" type="text" required="required" class="TField" id="Username" placeholder="Username"> 
     </div> 

     <div class="FormElement"> 
      <input name="Password" type="Password" required="required" class="TField" id="Password" placeholder="Password"> 
     </div> 

     <div class="FormElement"> 
      <input name="Login" type="submit" class="button" id="Login" placeholder="Login"> 
     </div> 
</body> 

connection.php, который подключается к базе данных и создает переменный $ CON

<?php 
mysql_connect("localhost", "MyRealUsername", "MyRealPassword"); 
mysql_select_db("Registration"); 
$con = mysqli_connect("localhost", "MyRealUsername", "MyRealPassword", "Registration"); 
?> 

большое спасибо за любую помощь!

+0

Добавить проверки - если такой пользователь нашел. –

ответ

0

Впишите свои изменения в ваш php-код. Вы в настоящее время проверяете только переменную post и аутентификацию пользователя. После получения значений из базы данных, пожалуйста, проверьте результат массив, а затем перенаправить Account.php, если пользователь существует в базе данных еще перенаправлять login.php

<?php 

if(isset($_POST['Login'])){ 

    $UN= $_POST['Username']; 
    $PW = $_POST['Password']; 

    $result = $con->query("Select * from users where Username='$UN' AND Password='$PW'"); 

    $row = $result->fetch_array(MYSQLI_BOTH); 

    if(isset($row) && $row['UserID'] != ""){ // authenticated user, redirect to account page 
    $_SESSION["UserID"] = $row['UserID']; 

    header('Location: Account.php'); 

    }else{ // redirect to login page 
     header('Location: Login.php'); 

    } 
} 
?> 

Также, пожалуйста, дезинфицировать входные значения в строке запроса, чтобы предотвратить SQL инъекции, как показано ниже.

$UN= $con->real_escape_string($_POST['Username']); 
    $PW = $con->real_escape_string($_POST['Password']); 

$result = $con->query("Select * from users where Username='$UN' AND Password='$PW'"); 
+0

Работал Отлично, спасибо! –

0

Ваша проблема в том, что вы не проверяете комбинацию пользователя/пароля.

Вы получаете запись пользователя из базы данных:

$UN= $_POST['Username']; 
$PW = $_POST['Password']; 

$result = $con->query("Select * from users where Username='$UN' AND Password='$PW'"); 

$row = $result->fetch_array(MYSQLI_BOTH); 

Но тогда вы не проверить, является ли такая запись выходов и просто войти пользователем regardlessly.

Добавить эту проверку:

if ($row) { 
    $_SESSION["UserID"] = $row['UserID']; 

    header('Location: Account.php'); 
} 

Еще одна вещь, эти две линии в connection.php совершенно бесполезны, так как они используют старую PHP Mysql библиотеку:

mysql_connect("localhost", "MyRealUsername", "MyRealPassword"); 
mysql_select_db("Registration"); 

Еще одна важная вещь, всегда отфильтровывать пользовательский ввод перед передачей его в SQL-запрос, так как не отфильтрованное приложение открывает приложение SQL Injection.

0
<?php 
    /* Only execute code if it is a post request */ 
    if($_SERVER['REQUEST_METHOD']=='POST'){ 

     /* Make sure all variables are at least set */ 
     if(isset($_POST['Login'], $_POST['Username'], $_POST['Password'])){ 

      /* basic filtering of posted data */ 
      $username=mysqli_real_escape_string($con, filter_input(FILTER_POST, 'Username', FILTER_SANITIZE_STRING)); 
      $password=mysqli_real_escape_string($con, filter_input(FILTER_POST, 'Password', FILTER_SANITIZE_STRING)); 

      /* Only proceed if there are non empty values after filtering */ 
      if(!empty($username) && !empty($password)){ 

       $sql="select * from `users` where `Username`='".$username."' and `password`='".$password."';"; 
       $result=$con->query($sql); 
       $uid=false; 

       /* Check you have a result */ 
       if($result && $result->num_rows() > 0){ 
        while($rs=$result->fetch_object()){ 
         $uid=$rs->UserID; 
        } 
       } 
       if($uid) { 
        $_SESSION["UserID"]=$uid; 
        header('location: account.php'); 
       } 

      } 



      /* 
       ------------------------------------------------ 
       Alternative method, using a "prepared statement" 
       ------------------------------------------------ 

       You do not need to be so particular filtering data 
       that is used in the sql query... 

      */ 
      $sql_prepared='select `UserID` from `users` where `Username`=? and `Password`=?'; 

      $stmt=$con->prepare($sql_prepared); 
      $stmt->bind_param('ss', $username, $password); 

      $username=$_POST['Username']; 
      $password=$_POST['Password']; 

      /* Only process if we have non-empty values */ 
      if(!empty($username) && !empty($password)){ 

       $result=$stmt->execute(); 
       $stmt->bind_result($uid); 

       if($result){ 
        $stmt->fetch(); 
        $stmt->close(); 

        $_SESSION["UserID"]=$uid; 
        header('location: account.php'); 
       } 
      } 
     } 
    } 
?> 
Смежные вопросы