使用PHP和Javascript的正确登录屏幕


Proper Login screen using PHP and Javascript

我正在为一个大学项目制作登录屏幕。现在我有这两个文件。

索引.php

<html>
<head>  
    <meta charset = 'UTF-8'>
    <link rel="shortcut icon" href="images/favicon.ico"/>           
    <title>Sistema de Estágios - UFMS - Login</title>
    <link href = "css/bootstrap.css" rel = "stylesheet" >
    <link href = "css/index.css" rel = "stylesheet" >
    <script src="js/jquery-1.11.1.min.js"></script>
    <?php
    session_start(); // start session
    if(isset($_SESSION["sessioname"]))
    {
        if($_SESSION["session_time"] >= time()) //time hasn't expired
        {
            $_SESSION["session_time"] = time() + 60;
            header("Location:users.php"); /* Redirect browser */
            exit();
        }
    }
    ?>
    <script type="text/javascript">
        $(document).ready(function()
        {
            $("input").blur(function() // This makes the container's border turn red when it is empty 
            {
                if($(this).val() == "")
                {
                    $(this).css({"border" : "1px solid #F00"});
                }
            });
            $("#botao").click(function()
            {
                var cont = 0;
                $("#form input").each(function()
                {
                    if($(this).val() == "")
                    {
                        $(this).css({"border" : "1px solid #F00"});
                        cont++;
                    }   
                });
                if(cont == 0)
                {
                    $("#form").submit();
                }
            });
        });
    </script>
</head>
<body>
<center>
    <center>
        <div class = "container">   
            <div class = "principal"> 
                    <form id="form" name="form" method="post" action="entra.php">
                        <p>
                            <label for="a">Nome de Usuário:</label>
                            <input id="a" type  ="text" name="username" class="form-control"/><br/>
                            <label id="name_null" hidden="hidden">O campo deve ser preenchido</label>
                        </p>
                        <p>
                            <label for="b">Password:</label>
                            <input id="b" type="password" name="password" class="form-control"/><br/>
                            <label id="pass_null" hidden="hidden">O campo deve ser preenchido</label>
                        </p>
                            <buttom id="botao" name="Entrar" value="login" class="btn btn-primary" style="width: 100%;">Login</buttom>
                    </form>
                <label> <a href="register.php"><button class="btn">Cadastre-se</button></a> </label>
            </div>
        </div>
    </center>
</center>
</body>

恩特拉.php

<html>
<head>
    <script src="js/jquery-1.11.1.min.js"></script>
</head>
<?php
require_once "config.php"; // include conection to database
$mysqli = new mysqli("localhost", "root", "", "sistema");
// verify if there is a person with the recived name
$Tipo = $_POST['tipo'];
$user_info = mysqli_query($mysqli,"SELECT * FROM users WHERE username='".addslashes($_POST['username'])."'");
if(mysqli_num_rows($user_info) != 0)
{
    $result = mysqli_fetch_array($user_info); // put the informations in an array
    if($result['password'] == sha1($_POST['password']))// if the password matches
    {
        session_start(); // começa a seesion
        header("Cache-control: private");
        $_SESSION["sessioname"] = $_POST['username'];
        $_SESSION["auto"] = $result["Tipo"];
        $_SESSION["id"]= $result["id"];
        $_SESSION["session_time"] = time() + 60;// expiration timne
        header("Location: users.php");
        die();
    }
    else
    { // else show an alert
        ?>
        <script type="text/javascript">
            alert("Senha incorreta");
        </script>
        <?php
        header("Location: index.php");
        die(); 
    }
}
header("Location: index.php");
?>

我正在寻找一种方法来使登录操作发生在index.php而不是entra.php上。我还在寻找一种更好的方法来管理会话过期时间。类似于全局变量的东西,因此每当我想更改它进行测试时,我就不必在每个文件上更改它。

我对PHP很陌生,所以我很乐意从你们那里得到一些帮助。

只需将entra.php代码移动到index.php文件中,并将表单的Post action更改为index.php

<form id="form" name="form" method="post" action="index.php">

会话:首先,使用 session_start() 启动会话并存储用户上次发出请求的时间

<?php
  $_SESSION['timeout'] = time();
?>

在后续请求中,检查他们发出上一个请求的时间(在本例中为 10 分钟)

<?php
  if ($_SESSION['timeout'] + 10 * 60 < time()) {
     // session timed out
  } else {
     // session ok
  }
?>

最好的解决方案是实现自己的会话超时。使用一个简单的时间戳来表示上次活动(即请求)的时间,并随每个请求进行更新。

通常管理设置的一个好方法是添加一个像config.php这样的文件,并将所有这些文件都存储在那里。由于您已经拥有它,因此您可以将所有内容存储在其中。

$_CONFIG["SESSION_EXPIRATION_TIME"] = 86400;

然后,您可以require_once它或将其包含在 lib 类中。配置文件和不做define("VAR", [val])的好处是,如果您需要自定义配置,您可以修改变量(假设您有一个测试服务器和一个生产服务器,并且与它们关联的不同数据库 - 您可以轻松地覆盖$_CONFIG。你不能做很多关于define)。

此外,有点困难(但有用)的是有一个名为 index.php 的通用文件,并在那里包含所有其他 php 文件(在某种程度上将逻辑与视图(html 代码)分开)。

此外,请mysqli_real_escape_string以防止用户名上的 SQL 注入。

作为一般规则,最好将逻辑放在单独的文件中并包含它,而不是将其内联到 HTML 中。

如果您希望它是一个文件,您可以随时检查用户是否已记录以及您的变量是否存在。类似的东西。

if(isset($_SESSION["sessioname"]) && $_POST['password'] !== NULL) {
    //login code
}

然后将action='entra.php'更改为action='index.php'(或者,但最好是完全省略它)。

当然,如果上述内容让您眯眼,您可以随时添加具有一些值的隐藏输入字段:)

哦,总是在你做header('...') .php后做一个exit() - 我应该在调用 Location: header 后调用 exit() 吗?

我希望这有所帮助!