2016-04-20 2 views
1

Я создал столбец с именем «permissions» в моей таблице базы данных со значением 1 для администратора и 2 для обычных пользователей. Проблема в том, что всякий раз, когда я вхожу в систему с обычным пользователем, он перенаправляет меня на страницу администратора.Сбой при входе на страницу PHP

<?php 
$con=mysql_connect('localhost','root','') or die(mysql_error()); 
mysql_select_db('user_registration') or die("cannot select DB"); 


if(isset($_POST["login"])){ 

    if(!empty($_POST['user']) && !empty($_POST['pass'])) { 

     $user = strip_tags($_POST['user']); 
     $pass = strip_tags($_POST['pass']); 


     $query=mysql_query("SELECT * FROM users WHERE username='".$user."' AND password='".$pass."'"); 
     $numrows=mysql_num_rows($query); 

     $permissions= "SELECT username FROM users WHERE permissions = '1'"; 
     $result=mysql_query($permissions); 


      if($numrows!=0) { 
       while($row=mysql_fetch_assoc($query)) { 
        $dbusername=$row['username']; 
        $dbpassword=$row['password']; 
       } 

       if($user == $dbusername && $pass == $dbpassword) { 
        session_start(); 
        $_SESSION['sess_user']=$user; 
         if (mysql_num_rows($result) == 1) { 
          header("Location: fullDB.php"); 
         } else { 
          header("Location: member.php"); 
         } 
       } 

      } else { 
       echo "Invalid username or password!"; 
      } 

    } else { 
     echo "All fields are required!"; 
    } 
} 
?> 
+2

Обратите внимание, что 'mysql_ *' теперь устарел от PHP7 из-за проблем с безопасностью. Предлагается переключиться на расширения mysqli_ * или 'PDO'. – Derek

+1

[Little Bobby] (http://bobby-tables.com/) говорит, что [ваш скрипт подвержен риску инъекций SQL.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent -SQL-инъекция-в-РНР). Даже [избегая строки] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) небезопасно! –

+1

Пожалуйста, прекратите использование 'mysql_ *' функций] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). [Эти расширения] (http://php.net/manual/en/migration70.removed-exts-sapis.php) были удалены в PHP 7. Узнайте о [подготовленном] (http://en.wikipedia.org/ wiki/Prepared_statement) для [PDO] (http://php.net/manual/en/pdo.prepared-statements.php) и [MySQLi] (http://php.net/manual/en/mysqli.quickstart .prepared-statements.php) и подумайте над использованием PDO, [это действительно довольно легко] (http://jayblanchard.net/demystifying_php_pdo.html). –

ответ

6

Вы делаете все админы пользователей, потому что вы делаете чек администратора совершенно неправильно:

$permissions= "SELECT username FROM users WHERE permissions = '1'"; 

Этот запрос не «этот пользователь администратор». Это «Есть ли пользователь-администратор в базе данных». Если у вас есть хотя бы один администратор, то ВСЕ пользователи будут рассматриваться как администраторы.

Поскольку вы уже принесли данные пользователя с первым запросом, второй запрос полностью избыточный:

$query=mysql_query("SELECT * FROM users WHERE username='".$user."' AND password='".$pass."'"); 

$row = mysql_fetch_assoc($query); 
if ($row['permissions'] == 1) { 
    ... admin user ... 
} else { 
    ... regular peon ... 
} 

И заметьте, что вы, несомненно, уязвимы для sql injection attacks, и используете устаревший/осуждаются Библиотека БД. функции mysql _ *() должны использоваться NOT.

+0

Я удалил второй запрос, но он больше не дошел до страницы администратора. –

1

Проблема связана с вашим запросом. Давайте взглянем поближе:

SELECT username FROM users WHERE permissions = '1' 

Что вы говорите здесь есть, дай мне только имена пользователей из таблицы пользователей, где приписывают разрешения равно 1. Предположим, у вас есть один администратор и один нормальной пользователь в вашей таблице с атрибутом разрешений, равным 1 и 2 соответственно. Этот запрос всегда возвращает вам одну строку, и вы проверяете, равно ли количество строк 1. Вы не проверяете тип пользователя, только «если есть административный пользователь».

Надеюсь, это поможет. Имейте в виду, что вы код уязвим для SQL Injection.

Смежные вопросы