Скрипт входа со скрытыми кнопками

Я использовал PHP и JavaScript для создания веб-сайта моего отца. Он хочет включить систему входа в свой веб-сайт, а у меня есть дизайн системы с использованием PHP. Моя проблема в том, как показать кнопки, если человек вошел в систему?

Например, у вас есть Дом , Продукты , О нас и Контакты . Я хочу иметь кнопки для Дилера , Дистрибьютора и, возможно, другой информации, если пользователь вошел в систему. Так что у меня будут Дом , Продукты , О нас , Контакты , Дилер (если авторизован дилер), Дистрибьютор (если авторизован дистрибьютор) и т. Д. вперед.

Будет ли JavaScript хорошим способом сделать это или PHP, а может быть и то и другое вместе? Использование JavaScript для отображения и скрытия кнопок и PHP для проверки того, какие кнопки отображать.

Ответов (6)

Решение

Что касается безопасности, нельзя доверять тому, что исходит от клиента :

  • Посетитель может увидеть весь ваш код (HTML и Javascript, но не PHP) и попробовать что-нибудь
  • Посетитель может даже не использовать браузер; отправить запрос с помощью скрипта тривиально просто

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

Если вы не собираетесь показывать кнопки, бесполезно отправлять HTML и изображения в браузер, а затем скрывать их с помощью Javascript. Я бы проверил с PHP.

Если вы используете javascript, чтобы скрыть кнопки, вы открываете дыру в безопасности в приложении. Злоумышленник может либо отключить javascript, либо применить свои собственные, чтобы обойти вашу безопасность.

Я предлагаю использовать PHP, чтобы выбрать отображение кнопок или нет. В .NET я делаю это довольно часто.

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

В моей работе мы создали библиотеку, которая предоставляет такие функции, как проверка, вошел ли пользователь в систему. Например:

<?php
require_once 'Auth.php';
// output some html
if (isLoggedIn()) {
    echo 'html for logged in user';
}
// rest of html

Для страниц, которые должны видеть только авторизованные пользователи, контроллер проверяет, вошли ли они в систему, и если нет, перенаправляет их на страницу входа.

<?php
public function viewCustomer($customerId) {
    if (!isLoggedIn())
        redirectToLoginPage();
}

В вашем файле меню или w / e вы помещаете:

<? require 'auth.php' ?>
<ul>
    <li><a href="">Home</a></li>
    <li><a href="">Products</a></li>
    <? if( loggedin() ): ?><li><a href="">Secret area</a></li><? endif; ?>
</ul>

Затем на страницах, требующих аутентификации, просто сделайте это:

<?php 
    require 'auth.php';
    require_login();
?>

Где auth.php может содержать:

<?php
    function loggedin(){
        return isset( $_SESSION['loggedin'] );
    }

    function require_login(){
        if( !loggedin() ){
            header( 'Location: /login.php?referrer='.$_SERVER['REQUEST_URI'] );
            exit;
        }
    }
?>

Все, что написал Кристиан Лескайер, правильно. Обратите внимание, однако, на то, что он сказал «я бы», а не «вам следует». Выбор не такой простой.

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

Это оставляет нам только один недостаток выполнения логики отображения / скрытия в Javascript - HTML-код, отправляемый пользователю, больше, чем необходимо. Это может не иметь большого значения.

Однако наличие логики отображения / скрытия в PHP имеет минус. Требуемый PHP-код обычно представляет собой суп из тегов . Код Акиры представляет собой хороший пример того, как это обычно делается.

Соответствующий код Javascript, вероятно, будет выглядеть примерно так:

if (logged())
{
    elementSecretArea.style.display = "list-item";
}

(при условии, что элементы, которые можно скрыть, по умолчанию имеют display: none).

Этот стиль также допускает приятный сценарий «Ajax»: пользователь видит страницу без секретной области, вводит пароль, видит секретную область, и все это без обновления страницы.

Итак, если у вас уже есть сценарий, который запускается при загрузке документа по другим причинам, я бы серьезно подумал о том, чтобы иметь там логику отображения / скрытия.

В основном там, где у вас есть меню в html, скажем, в виде списка <ul> <li>Home</li> </ul> вы добавляете php после </li> последнего элемента:

<?php
  if($session-logged_in) {    
?>

<li>My Account</li>

<?php  
  }
?>