23

我一直在使用 PHP 和 JavaScript 来构建我父亲的网站。他想在他的网站中加入一个登录系统,而我使用 PHP 设计了该系统。我的问题是如果该人已登录,我如何显示按钮?

例如 -您有主页产品关于我们联系方式。如果用户登录,我希望有DealerDistributor和其他信息的按钮。所以我将有HomeProductsAbout UsContacts、 Dealer (如果经销商登录)、Distributor(如果经销商登录)等等向前。

JavaScript 会是这样做的好方法,还是 PHP 会,或者两者兼而有之?使用 JavaScript 显示和隐藏按钮,使用 PHP 检查显示哪些按钮。

4

6 回答 6

20

关于安全性,您不能相信来自客户端的内容

  • 访问者可以看到您的所有代码(HTML 和 Javascript,而不是 PHP)并尝试一些东西
  • 访问者甚至可能不会使用浏览器;使用脚本发送请求非常容易

这意味着隐藏按钮是良好的用户界面设计(因为如果您未登录,则无法使用它们)。但这不是安全功能。安全功能在服务器上检查访问者是否在需要它的每个操作之前登录。

如果您不打算显示按钮,则将 HTML 和图像发送到浏览器然后使用 Javascript 隐藏它们是没有用的。我会用PHP检查。

于 2008-08-10T07:59:22.890 回答
9

在您的菜单文件或 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;
        }
    }
?>
于 2008-08-11T01:35:58.187 回答
2

如果您使用 javascript 隐藏按钮,则会在应用程序中打开一个安全漏洞。恶意用户可以禁用 javascript 或应用他们自己的一些来绕过您的安全。

我建议使用 PHP 来选择是否呈现按钮。我经常在.NET 中这样做。

每当他们尝试使用受限按钮时,您应该能够检查用户在服务器端的访问权限。

于 2008-08-10T04:02:56.520 回答
1

我们在工作中所做的是有一个库,它提供了诸如检查用户是否登录之类的功能。例如:

<?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();
}
于 2008-08-11T01:23:45.187 回答
1

Christian Lescuyer 所写的一切都是正确的。但是请注意,他说的是“我愿意”而不是“你应该”。选择并不那么容易。

首先,安全性不是选择的问题。执行操作时,您应该对服务器进行安全检查。哪个代码决定显示/隐藏导致该操作的按钮是无关紧要的。

这让我们在 Javascript 中执行显示/隐藏逻辑只有一个缺点——发送给用户的 HTML 比必要的要大。这可能没什么大不了的。

不过,在 PHP 中显示/隐藏逻辑确实有一个缺点。所需的 PHP 代码通常是标签汤。Akira 的代码提供了一个很好的例子来说明它通常是如何完成的。

相应的 Javascript 代码可能看起来像这样:

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

(假设可以隐藏的元素默认具有 display:none )。

这种风格也允许很好的“Ajax”场景:用户看到一个没有秘密区域的页面,输入密码,看到秘密区域都没有刷新页面。

所以,如果你已经有一个脚本在你的文档加载时运行,我会认真考虑在那里有显示/隐藏逻辑。

于 2008-08-25T18:32:29.000 回答
0

基本上,您的菜单在 html 中,例如在最后一项<ul> <li>Home</li> </ul>之后添加 php的列表:</li>

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

<li>My Account</li>

<?php  
  }
?> 
于 2009-09-18T18:50:19.703 回答