Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查用户是否已登录php?_Php_Authentication_Session_Session State - Fatal编程技术网

如何检查用户是否已登录php?

如何检查用户是否已登录php?,php,authentication,session,session-state,Php,Authentication,Session,Session State,我对PHP非常陌生,我正在尝试找出如何使用会话来检查和查看用户是否登录到网站,以便他们有权访问特定页面 这是一件复杂的事情,还是因为我是一个无法理解的noob?任何要执行会话检查的页面都需要从以下内容开始: session_start(); 从那里,您可以检查会话数组中是否存在指示它们已登录的变量: if (!$_SESSION["loggedIn"]) redirect_to_login(); 将其登录只需设置该值: $_SESSION["loggedIn"] = true; 登录并不太

我对PHP非常陌生,我正在尝试找出如何使用会话来检查和查看用户是否登录到网站,以便他们有权访问特定页面


这是一件复杂的事情,还是因为我是一个无法理解的noob?

任何要执行会话检查的页面都需要从以下内容开始:

session_start();
从那里,您可以检查会话数组中是否存在指示它们已登录的变量:

if (!$_SESSION["loggedIn"]) redirect_to_login();
将其登录只需设置该值:

$_SESSION["loggedIn"] = true;

登录并不太复杂,但几乎所有登录过程都需要一些特定的部分

首先,确保在需要了解登录状态的所有页面上启用会话变量,方法是将其放在这些页面的开头:

session_start();
接下来,当用户通过登录表单提交用户名和密码时,您通常会通过查询包含用户名和密码信息的数据库(如MySQL)来检查他们的用户名和密码。如果数据库返回匹配项,则可以设置会话变量以包含该事实。您可能还希望包括其他信息:

if (match_found_in_database()) {
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username; // $username coming from the form, such as $_POST['username']
                                       // something like this is optional, of course
}
然后,在取决于登录状态的页面上,放置以下内容(不要忘记
会话\u start()
):

这些是基本组成部分。如果您需要SQL方面的帮助,网上有很多教程。

在Login.html文件中:

else if (isset($_GET['actie']) && $_GET['actie']== "aanmelden"){

    $username= $_POST['username'];
    $password= md5($_POST['password']);
    $query = "SELECT password FROM tbl WHERE username = '$username'";
    $result= mysql_query($query);
    $row= mysql_fetch_array($result);

    if($password == $row['password']){
            session_start();
            $_SESSION['logged in'] = true;
            echo "Logged in";

    }
}

登录表单
登录

在Login.php文件中:


请参阅此脚本以进行注册。它简单易懂

<?php
    define('DB_HOST', 'Your Host[Could be localhost or also a website]');
    define('DB_NAME', 'database name');
    define('DB_USERNAME', 'Username[In many cases root, but some sites offer a MySQL page where the username might be different]');
    define('DB_PASSWORD', 'whatever you keep[if username is root then 99% of the password is blank]');

    $link = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);

    if (!$link) {
        die('Could not connect line 9');
    }

    $DB_SELECT = mysql_select_db(DB_NAME, $link);

    if (!$DB_SELECT) {
        die('Could not connect line 15');
    }

    $valueone = $_POST['name'];
    $valuetwo = $_POST['last_name'];
    $valuethree = $_POST['email'];
    $valuefour = $_POST['password'];
    $valuefive = $_POST['age'];

    $sqlone = "INSERT INTO user (name, last_name, email, password, age) VALUES ('$valueone','$valuetwo','$valuethree','$valuefour','$valuefive')";

    if (!mysql_query($sqlone)) {
        die('Could not connect name line 33');
    }

    mysql_close();
?>

在检查当前会话之前,您需要在所有页面上显示以下内容:

session_start();
检查
$\u会话[“loggedIn”
](不是)是否为真-如果不是,将它们重定向到登录页面

if($_SESSION["loggedIn"] != true){
    echo 'not logged in';
    header("Location: login.php");
    exit;
}

这个页面上几乎所有的答案都依赖于检查会话变量的存在来验证用户登录。这是绝对好的,但重要的是要考虑到PHP会话状态不是唯一的应用程序,如果有多个虚拟主机/网站上相同的裸露金属。 如果Web服务器上有两个PHP应用程序,都使用名为“isLoggedIn”的会话变量中的布尔标志检查用户的登录状态,则用户可以登录其中一个应用程序,然后自动获得对第二个应用程序的访问权限,而无需凭据

我怀疑即使是商业共享主机上的大多数恐龙也不会让虚拟主机以相同的方式共享相同的PHP环境,这种方式可能会发生在多个客户站点上(但是),但是它在你自己的环境中需要考虑。

非常简单的解决方案是使用识别应用程序的会话变量,而不是布尔标志。e、 g$SESSION[“isLoggedInToExample.com”]


资料来源:我是一名渗透测试人员,在如何不做事情方面有很多经验。

你可以做一个会话并将其放置在:

// Start session
session_start();

// Check do the person logged in
if($_SESSION['username']==NULL){
    // Haven't log in
    echo "You haven't log in";
}else{
    // Logged in
    echo "Successfully logged in!";
}

注意:您必须制作一个表单,其中包含
$\u SESSION['username']=$login\u input\u username

是的,但我正在找人以我能理解的方式解释它,谢谢!谢谢你的解释。我想知道是否有可能限制文件夹而不是页面?因此,我在该文件夹中的任何页面都受到限制,除非您在2014年登录?mysql_*。不要使用此脚本。它已经过时,并且容易受到注入攻击。否决了将高度易受攻击的脚本作为操作指南。这不仅不能回答最初的问题,而且是一个糟糕的例子。该脚本对SQL注入开放,从个人角度来看,我不会向任何人推荐phpmyadmin。此代码易受SQL注入攻击,您不应该在2019年将密码存储为MD5哈希,它使用不推荐的PHP函数,并且没有任何解释。这是一个糟糕的答案,应该删除。而且,由于没有错误检查。。。可能会强制$row和$password值为FALSE,从而绕过登录。我刚检查过,md5()在失败时返回值为FALSE。。。因此,将密码值作为数组而不是字符串发送将绕过它。即使作为蓝图,这也会让我怒不可遏。只有密码正确时才会调用该会话_start()。那个么,那个些已经登录但最终试图用错误的凭据再次登录的人呢?。。。他们是否会在下一个响应中被踢到,但是如果他们导航到另一个页面,他们会神奇地再次登录?会话_start()应该在其他地方。我可以写一本书来说明我为什么讨厌这个答案。这是一个正确的观点。在大多数用例中,您的e存储会话登录布尔标志,带有附加会话变量,如用户令牌,可用于在提供访问之前完全验证用户。但正如前面所述,$SESSION[“isLoggedInToExample.com”]是一种比$SESSION[“loggedIn”]更好的方法,但我希望在授予访问权限之前也验证一个唯一的字段。我认为上述内容可能足以验证对站点的访问,因为它来自cookie。。。暗示某种基于表单的身份验证已经发生。除此之外,您还可以执行额外的检查,以获得更精细的用户访问控制级别;取决于您运行的站点类型。会话信息的安全程度如何?我知道它存储在服务器上的
tmp
目录中。攻击者是否可以修改会话数据以登录?这是我应该关心的事吗?另外,我应该避免在会话中存储加密密钥吗?我想你在那里问了一个新问题@IndianaKernick。会话数据是安全的,因为它不在web根目录中。但它可能永远都不是一个适合加密密钥的地方。您需要一个具有正确访问权限的数据库
// Start session
session_start();

// Check do the person logged in
if($_SESSION['username']==NULL){
    // Haven't log in
    echo "You haven't log in";
}else{
    // Logged in
    echo "Successfully logged in!";
}