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

Php 无需数据库即可轻松登录脚本

Php 无需数据库即可轻松登录脚本,php,login,Php,Login,如何创建一个不需要数据库的简单登录脚本。我希望它是安全的 好的,这个脚本怎么样,我只是用我的php知识编写的 <?php // Start session session_start(); // Username and password $ID = "admin"; $pass = "123456"; if (isset($_POST["ID"]) && isset($_POST["pass"])) { if ($_POST["ID"] === $an

如何创建一个不需要数据库的简单登录脚本。我希望它是安全的

好的,这个脚本怎么样,我只是用我的php知识编写的

<?php 
// Start session
session_start(); 

// Username and password
$ID = "admin";
$pass = "123456";

if (isset($_POST["ID"]) && isset($_POST["pass"])) { 

    if ($_POST["ID"] === $anvandarID && $_POST["pass"] === $pass) { 
    /
    $_SESSION["inloggedin"] = true; 

    header("Location: safe_site.php"); 
    exit; 
    } 
        // Wrong login - message
        else {$wrong = "Bad ID and password, the system could not log you in";} 
}
?> 

如果您没有数据库,则必须在代码中硬编码登录详细信息,或从磁盘上的平面文件中读取。

将用户名和密码哈希值以数组形式保存在php文件中,而不是数据库中

当您需要对用户进行身份验证时,请计算其凭据的哈希值,然后将其与数组中的哈希值进行比较


如果使用安全散列函数(参见PHP文档),它应该是相当安全的(您可以考虑使用盐散列),并且还可以对表单本身添加一些保护。

< P>如果您没有数据库,您的用户登录数据的永久记录将存储在何处?当然,当用户登录时,站点工作所需的最小用户信息可以存储在会话或cookie中。但在他们注销后,又会怎样?会话消失,cookie可能被黑客攻击

因此,您的用户会返回到您的站点。他试图登录。您的站点将他的登录信息与哪些值得信赖的东西进行比较?

或者有两个很好的选择


基本上,你的用户登录到他们已经是成员的其他网站(Facebook或Google),然后你从该网站得到确认,告诉你该用户是可信的——启动一个会话,他们就登录了。不需要数据库(除非您想将更多数据关联到他们的帐户)。

这不是一个理想的解决方案,但这里有一个简单的示例,演示了如何在PHP代码中存储登录信息:

<?php
session_start();

$userinfo = array(
                'user1'=>'password1',
                'user2'=>'password2'
                );

if(isset($_GET['logout'])) {
    $_SESSION['username'] = '';
    header('Location:  ' . $_SERVER['PHP_SELF']);
}

if(isset($_POST['username'])) {
    if($userinfo[$_POST['username']] == $_POST['password']) {
        $_SESSION['username'] = $_POST['username'];
    }else {
        //Invalid Login
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Login</title>
    </head>
    <body>
        <?php if($_SESSION['username']): ?>
            <p>You are logged in as <?=$_SESSION['username']?></p>
            <p><a href="?logout=1">Logout</a></p>
        <?php endif; ?>
        <form name="login" action="" method="post">
            Username:  <input type="text" name="username" value="" /><br />
            Password:  <input type="password" name="password" value="" /><br />
            <input type="submit" name="submit" value="Submit" />
        </form>
    </body>
</html>

登录
您是以用户身份登录的

用户名:
密码:

您可以使用HTTP基本身份验证和身份验证在Web服务器级别执行访问控制。这方面存在许多问题:

  • 它不是很安全(用户名和密码在电线上的编码很简单)
  • 很难维护(您必须登录服务器才能添加或删除用户)
  • 您无法控制浏览器显示的登录对话框
  • 除非重新启动浏览器,否则无法注销

  • 除非您正在构建一个供内部用户使用的站点,否则我不会真正推荐它。

    没有理由不使用数据库来实现登录,如果您的托管公司没有为您提供足够的数据库,您至少可以下载并安装SQLite。

    我会使用这样的两个文件设置:

    index.php

    <?php 
    session_start(); 
    
    define('DS',  TRUE); // used to protect includes
    define('USERNAME', $_SESSION['username']);
    define('SELF',  $_SERVER['PHP_SELF'] );
    
    if (!USERNAME or isset($_GET['logout']))
     include('login.php');
    
    // everything below will show after correct login 
    ?>
    
    
    
    login.php

    <?php defined('DS') OR die('No direct access allowed.');
    
    $users = array(
     "user" => "userpass"
    );
    
    if(isset($_GET['logout'])) {
        $_SESSION['username'] = '';
        header('Location:  ' . $_SERVER['PHP_SELF']);
    }
    
    if(isset($_POST['username'])) {
        if($users[$_POST['username']] !== NULL && $users[$_POST['username']] == $_POST['password']) {
      $_SESSION['username'] = $_POST['username'];
      header('Location:  ' . $_SERVER['PHP_SELF']);
        }else {
            //invalid login
      echo "<p>error logging in</p>";
        }
    }
    
    echo '<form method="post" action="'.SELF.'">
      <h2>Login</h2>
      <p><label for="username">Username</label> <input type="text" id="username" name="username" value="" /></p>
      <p><label for="password">Password</label> <input type="password" id="password" name="password" value="" /></p>
      <p><input type="submit" name="submit" value="Login" class="button"/></p>
      </form>';
    exit; 
    ?>
    

    ***未链接到数据库或外部文件的登录脚本。适用于全局密码-

    放置在登录表单页面上-将其放置在登录页面的顶部-高于所有其他内容***

    <?php
    
    if(isset($_POST['Login'])){
    
    if(strtolower($_POST["username"])=="ChangeThis" && $_POST["password"]=="ChangeThis"){
    session_start();
    $_SESSION['logged_in'] = TRUE;
    header("Location: ./YourPageAfterLogin.php");
    
    }else {
    $error= "Login failed !";
    }
    }
    //print"version3<br>";
    //print"username=".$_POST["username"]."<br>";
    //print"password=".$_POST["username"];
    ?>
    
    
    
    *登录以下页面-将其放置在需要登录保护的每个页面的顶部。这将检查会话,以及用户名和密码是否有*

    <?php
    session_start();
    if(!isset($_SESSION['logged_in']) OR $_SESSION['logged_in'] != TRUE){
    
    header("Location: ./YourLoginPage.php");
    }
    ?>
    
    
    
    试试这个:

    <?php
            session_start();
            $userinfo = array(
                'user'=>'5d41402abc4b2a76b9719d911017c592', //Hello...
            );
    
            if(isset($_GET['logout'])) {
                $_SESSION['username'] = '';
                header('Location:  ' . $_SERVER['PHP_SELF']);
            }
    
            if(isset($_POST['username'])) {
                if($userinfo[$_POST['username']] == md5($_POST['password'])) {
                    $_SESSION['username'] = $_POST['username'];
                }else {
                    header("location:403.html"); //replace with 403
                }
            }
    ?>
    <?php if($_SESSION['username']): ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title>Logged In</title>
            </head>
    
            <body>
                <p>You're logged in.</p>
                <a href="logout.php">LOG OUT</a>
            </body>
        </html>
    
    <?php else: ?>
        <html>
            <head>
                <title>Log In</title>
            </head>
            <body>
                <h1>Login needed</h1>
                <form name="login" action="" method="post">
                    <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
                        <tr>
                            <td colspan="3"><strong>System Login</strong></td>
                        </tr>
                        <tr>
                            <td width="78">Username:</td>
                            <td width="294"><input name="username" type="text" id="username"></td>
                        </tr>
                        <tr>
                            <td>Password:</td>
                            <td><input name="password" type="password" id="password"></td>
                        </tr>
                        <tr>
                            <td>&nbsp;</td>
                            <td><input type="submit" name="Submit" value="Login"></td>
                        </tr>
                    </table>
                </form>
            </body>
        </html>
    <?php endif; ?>
    
    
    登录
    你已经登录了

    登录 需要登录 系统登录 用户名: 密码:
    您将需要注销,类似于以下内容(logout.php):

    
    //除非缺少上面的标题,否则不需要下面的标题。在这种情况下,请在此处输入已注销的文本。
    无标题文件
    
    我不能将登录详细信息存储在变量中吗?你可以,这就是他所说的“在代码中硬编码登录详细信息”的意思。你如何创建一个不需要ASP数据库的简单登录脚本?现在,我在上面的第一篇文章中添加的示例怎么样。@Elijah:你想让所有用户使用相同的用户名/密码吗?不,不是很简单,但现在我看到马克贴了一个又快又脏的解决方案,我现在就用它!谢谢大家的帮助,我感谢你们的时间。@Elijah:如果您只需要一小部分用户,那么提供的解决方案标记就可以了。该解决方案的扩展性不太好。谢谢!这可能比我的好。以纯文本形式存储密码通常被认为是不安全的。任何人看到这些密码的唯一方法是如果web服务器停止解析PHP。然后,您将面临一个更大的问题:)他只是在寻找快速简单的方法。当应用程序中存在其他漏洞时,服务器不必停止解析PHP(始终至少存在一个:),攻击者将能够在没有任何人知道的情况下读取其他人的密码,正如您所说,这是一个大问题。很少的sha1函数调用不会杀死任何人,而且会更安全。弗兰克,回答得很好-但是问题已经回答了,答案被接受了。如果您想解释为什么您的答案不同于或优于公认的答案,这可能会有所帮助。此解决方案与原始问题中的解决方案不一样吗?URL现在显示“对不起,您访问的链接可能已断开,或者页面可能已被删除。”-应该删除它。
    <?php
            session_start();
            $userinfo = array(
                'user'=>'5d41402abc4b2a76b9719d911017c592', //Hello...
            );
    
            if(isset($_GET['logout'])) {
                $_SESSION['username'] = '';
                header('Location:  ' . $_SERVER['PHP_SELF']);
            }
    
            if(isset($_POST['username'])) {
                if($userinfo[$_POST['username']] == md5($_POST['password'])) {
                    $_SESSION['username'] = $_POST['username'];
                }else {
                    header("location:403.html"); //replace with 403
                }
            }
    ?>
    <?php if($_SESSION['username']): ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title>Logged In</title>
            </head>
    
            <body>
                <p>You're logged in.</p>
                <a href="logout.php">LOG OUT</a>
            </body>
        </html>
    
    <?php else: ?>
        <html>
            <head>
                <title>Log In</title>
            </head>
            <body>
                <h1>Login needed</h1>
                <form name="login" action="" method="post">
                    <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
                        <tr>
                            <td colspan="3"><strong>System Login</strong></td>
                        </tr>
                        <tr>
                            <td width="78">Username:</td>
                            <td width="294"><input name="username" type="text" id="username"></td>
                        </tr>
                        <tr>
                            <td>Password:</td>
                            <td><input name="password" type="password" id="password"></td>
                        </tr>
                        <tr>
                            <td>&nbsp;</td>
                            <td><input type="submit" name="Submit" value="Login"></td>
                        </tr>
                    </table>
                </form>
            </body>
        </html>
    <?php endif; ?>
    
    <?php
        session_start();
        session_destroy();
        header("location:index.html"); //Replace with Logged Out page. Remove if you want to use HTML in same file.
    ?>
    
    // Below is not needed, unless header above is missing. In that case, put logged out text here.
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>Untitled Document</title>
        </head>
        <body>
            <!-- Put logged out message here -->
        </body>
    </html>