Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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_Mysql_Server - Fatal编程技术网

Php 主要网站如何检查用户身份验证?

Php 主要网站如何检查用户身份验证?,php,mysql,server,Php,Mysql,Server,作为标题,我问这个问题是因为我知道如何检查用户是否登录的唯一方法是在每个文件的顶部有一个会话和一个对数据库的查询,以比较会话值 我有类似于这个函数的东西,然后我在每个php文件上调用这个函数,这很好。然而,我不认为facebook、youtube等大型网站有这种方法,这也意味着我的所有文件都必须是.php我不能有.html,因为我无法运行下面的功能 public function isSessionValid() { session_start(); $dbConfig = ne

作为标题,我问这个问题是因为我知道如何检查用户是否登录的唯一方法是在每个文件的顶部有一个会话和一个对数据库的查询,以比较会话值

我有类似于这个函数的东西,然后我在每个php文件上调用这个函数,这很好。然而,我不认为facebook、youtube等大型网站有这种方法,这也意味着我的所有文件都必须是
.php
我不能有
.html
,因为我无法运行下面的功能

public function isSessionValid()
{
    session_start();
    $dbConfig = new dbconfig("users");
    $dbUser = $dbConfig->getDbUser();
    $getUser = new GetUser($dbUser);
    $result = $getUser->getUser($_SESSION['UN'],$_SESSION['PW'] );
    if(!count($result) > 0){
        header("Location: ../index.html");
    }
}

我的问题是检查用户凭据的其他有效方法是什么

一种解决方案是将Web服务器配置为首先通过
isSessionValid()
自动路由所有请求,然后再路由到它们的实际目的地。

您不希望出现以下情况:

$\会话['PW']

纯文本未加密密码是一个严重的问题。您可以在登录时创建一个访问令牌,该令牌是一个随机散列字符串,并保存到用户cookie中

下面是一个例子:

function login()
{
    $userName = 'billy';
    $password = 'foobar';

    // get your user data using username and password.
    $userObject = new User();
    $userId = $userObject->id;

    // create our secure hash.
    $accessToken = password_hash($password, PASSWORD_DEFAULT);

    // update the user in the row.
    mysqli_query($link, "UPDATE users set access_token='$accessToken' WHERE id = $userId");

    // expires in 1 day, auto logout.
    setcookie('userAccessToken', $accessToken, time() + 86400);
}

function getUser() {
    return mysqli_query($link, "SELECT * from users WHERE access_token = ".$_COOKIE['userAccessToken']);
}
现在,您只需要检查一个属性,即访问令牌,它存储在cookies中,以防它们返回。使用哈希方法可以防止任何人嗅探cookies并获取私人信息

对于代码可维护性,您不需要重复的代码,应该始终尝试创建可在所有页面中使用的小型可重用组件。制作一个名为auth.PHP的PHP文件,然后在需要它的页面中只需要它

// UserPage.php
require_once __DIR__.'/lib/auth.php';

$user = getUser();

// MessagePage.php
require_once __DIR__.'/lib/auth.php';

$user = getUser();

// lib/auth.php
function getUser() {
   return mysqli_query($link, "SELECT * from users WHERE access_token = ".$_COOKIE['userAccessToken']);
}

作为旁注,我建议您不要用普通的php编写应用程序并构建自己的框架,而应该签出。他们有视频教程,该框架解决了开发人员遇到的许多常见问题,包括这个问题。

谢谢,这听起来正是我想要的。不知道为什么有人否决投票,答案有问题吗?谢谢你指出我遇到的安全问题。你能进一步解释吗?是什么让你认为其他页面不是这样工作的?此外,仅仅因为URL以
.html
结尾并不意味着它不由PHP(或其他服务器端语言)提供服务