Как вы можете ограничить доступ незарегистрированных пользователей, предоставив полный доступ зарегистрированным пользователям?

Я пытаюсь создать веб-страницу с пользователями и информацией, доступ к которой могут получить только зарегистрированные пользователи. Можно ли ограничить файлы, которые может видеть незарегистрированный пользователь? Если да, то как? У меня уже есть база данных MySQL с подключением в index.php. Вот что у меня есть до сих пор:

<head></head>
<body>
    <h3>Signup Here:</h3>
        <form method="post" action="userindex.php">

                Please enter user name: <input type="text" name="username" value="" /><br />
                 Please enter password: <input type="password" name="password" value="" />
                <br />
                <input type="submit" value="Submit"/>



        </form>
</body>

<?php
include ("dbroutines.php");

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


    if ($_POST['username']>'' && $_POST['password']>'' ) {
        $q="insert into users (Name, Password ) values ('".$_POST['username']."', '".$_POST['password']."')";
        echo 'query='.$q;
        $conn=db_connect();
        $result=$conn->query($q);
        echo '<br />xxx'.$conn->error."xxx";
        unset($_POST['username']);
        unset($_POST['password']);
    } else {
        echo 'Please enter both username AND password!';
    }

}

$q="select Name, Password from users";
$conn=db_connect();
$result=$conn->query($q);
echo 'xxx'.$conn->error."xxx";
if ($result){




           echo '<hr />';
            for ($count=0; $row=$result->fetch_row(); ++$count ) {
                echo $count." Name=".$row[0]." password=".$row[1].'<br />';

            }
          echo '<b style="color:red;">there are '.$count.' users in your database!'.'</b><hr />';
}

Исходя из этого, можете ли вы указать, какой пользователь получает доступ к определенным файлам, таким как userindex.php?


person Max    schedule 27.03.2013    source источник
comment
Я не могу понять вашу точку зрения. Вы хотите предоставить доступ к своему веб-сайту после входа в него? Что вы хотите? Можешь еще раз объяснить?   -  person chintan    schedule 27.03.2013
comment
Я хотел, чтобы клиент (не вошедший в систему) имел ограниченный доступ к файлам на сайте, в то время как тот же пользователь, вошедший в систему, имел бы больший доступ к файлам на веб-сайте.   -  person Max    schedule 27.03.2013


Ответы (3)


Я думаю, что проверка пользователя не является надежным решением. Вы должны сохранить токен в сеансе, чтобы помнить, что этот пользователь является зарегистрированным пользователем. Вы должны создать общую php-страницу с именем Security.php, где вы разместите следующий код, потому что умный пользователь может напрямую ввести URL-адрес и получить доступ к вашим конфиденциальным страницам. Вам нужно включить эту страницу вверху каждой страницы php, которую вы хотите защитить.

         if (!isset($_SESSION['AuthId'])) {
         header('Location:Login.php');
         exit;
         }
person Devesh    schedule 27.03.2013

да. Запросите вашу базу данных для кого-то с заданным именем пользователя и паролем, используя запрос, который будет выглядеть примерно так:

select * from users where Name = 'john.doe' and Password = 'hunter2' limit 1

Если он выдает какие-либо строки, пользователь существует, и вы должны впустить его. Если строк нет, то эта комбинация имени пользователя и пароля недействительна, и вы не должны впускать их.

Это основы, но если вы действительно собираетесь запустить это в производство, вам нужно внести еще несколько изменений:

  • Избегайте данных, которые вы вводите в запрос, или используйте подготовленные запросы. Ваш код уязвим для инъекций SQL. Скажем, например, я пытался создать учетную запись с апострофом в имени пользователя или пароле. Ваш код сломается. Это также может быть использовано для вредоносных целей, поэтому вам действительно следует это исправить.

    Самый простой способ исправить это — экранировать все до того, как вы поместите это в запрос, используя, скажем, mysql_real_escape_string. Вероятно, это сработает, но еще лучше (поскольку все mysql_ семейство функций устарело) использовать подготовленные запросы и PDO, как показано ниже.

  • Хешируйте и солите свои пароли, чтобы компрометация базы данных (что может произойти довольно легко, если вышеуказанная уязвимость не будет исправлена) не раскрыла все пароли.

Тогда ваш код может выглядеть так:

// You'd probably want to put these in a separate configuration file.
$db = new PDO('mysql:dbname=test', 'my_mysql_user', 'hunter2');

// Make any errors throw an exception.
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $db->prepare('select * from users where Name = :name limit 1');
$query->bindValue(":name", $_POST['username'], PDO::PARAM_STR);
$row = $query->fetch(PDO::FETCH_ASSOC);

if($row === FALSE) {
    // User not in the database; don't let them in.
}

$calculatedHash = hash("sha512", $row['PasswordSalt'] . $_POST['password']);
if($calculatedHash === $row['PasswordHash']) {
    // Password's right. Let them in.
}else{
    // Password's wrong. Keep them out.
}

Дальнейшие улучшения заключались бы в использовании, скажем, bcrypt вместо SHA-512 с солью.

person icktoofay    schedule 27.03.2013

Вы можете поместить одно дополнительное поле в имя таблицы входа в систему «Роль».

Каждое время входа в систему. Проверьте, является ли он главным пользователем, тогда он может получить больший доступ.

Если это дополнительный пользователь, то ограниченный доступ.

Вы поняли мою точку зрения? Или любой запрос?

person chintan    schedule 27.03.2013