登录并绕过登录屏幕

时间:2016-05-15 04:41:28

标签: php mysql login

所以我建立了我的第一个使用注册和登录的网站,它已经使用php和mysql实现了。我的问题是,如果用户在通过登录页面后获得了他访问过的页面的URL,他现在可以在URL中复制并粘贴这些页面并绕过登录。

问题:有什么方法可以确保实际登录?

我的主机000Webhost(免费)允许文件夹受密码保护,但我不知道如何或者是否可以将其绑定到我的用户数据库。

这是我就这个问题提出的第一个问题。请多一点。

2 个答案:

答案 0 :(得分:1)

是的,有很简单的方法可以检查用户是否已登录,最好的方法是使用$_SESSION超全局。当您使用会话超全局时,您基本上将信息保存到服务器上关于特定用户,同时在用户计算机上保存cookie,只要会话有效(通常为30分钟),就可以唯一地标识他。用简单的英语,php开发人员创建了一个超级全局,这基本上使开发人员能够非常轻松地维护状态"无需执行大量代码。

这就是你如何使用会话超全局。在您网站的每个页面的顶部,您将拥有这部分代码(甚至高于<!DOCTYPE html>):

<?php session_start(); ?>

这样做(在很多其他事情中)是在用户计算机上保存一个cookie,在会话有效时识别他。 现在... 在用户登录后输入的页面上,您将拥有类似于以下内容的代码:

<?php

$username = $_POST['username'];//obtaining username from form
$password = $_POST['password'];//obtaining password from form
// i did not include any encryption code in this example
// so that the example is easier to understand, but keep in mind
// that encrypting your users passwords is super important

//for security reasons, I used prepared statements and binding parameters
//to compare the password and username obtained from the form with
//those in the database (in order to prevent sql injection):
$sql = "SELECT 1 FROM users WHERE username = :username AND password = :password LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();

if ($stmt->rowCount()>0)//if a row was found, then you know this user exists
{
//here I am saving information in the session super global that
//can be used to not only identify if a user is logged in on each
//page, but also to see which user is logged in, since often
//you want to give a user his own control panel or other features.
  $_SESSION['authenticated'] = TRUE;
  $_SESSION['username'] = htmlspecialchars($username);
}

?>

现在,在您拥有的每个页面上,您都会包含以下代码:

<?php
if (isset($_SESSION['authenticated']))
{
  echo "Hello there ".$_SESSION['username']."!<br>"; 
}
?>

之前的代码会回复类似&#34;你好约翰!&#34;如果用户名是John。从这里开始,您可以在您希望用户登录的括号中包含您想要的任何代码,以查看未登录的用户因此无法查看该网站的该部分,即使他们会看到网站徽标,以及if条件内的所有其他内容。此外,以前的代码不必位于最顶层,只需要<?php session_start(); ?>,这是因为有关HTTP协议如何工作的原因。

如果这有帮助或者您有任何其他问题,请告诉我。

答案 1 :(得分:0)

Webeng的上述答案包含了您需要的大部分内容,但您需要了解如何建立数据库连接,以便正确使用准备好的语句。查找PDO或mysqli数据库连接。

他完全正确地使用SESSION变量来跟踪用户是否已登录,以及是否为SQL使用预准备语句。

关于他的答案,我要改变的一件事是每页的顶部。我会改用它,这样如果用户在页面加载时没有登录,它们会被发送回登录页面:

if (!isset($_SESSION['username'])) { header("Location: login.php"); }
相关问题