2016-05-15 225 views
0

因此,我建立了我的第一个使用注册和登录的网站,并使用php和mysql实施。我的问题是,如果用户获得了他在通过登录页面后访问的页面的URL,他目前能够将这些页面复制并粘贴到URL中并绕过登录。登录并绕过登录屏幕

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

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

这是我在这个问题上提出的第一个问题..请客气一点。

+0

发布此她:http://stackoverflow.com/questions/37234576/php-setting-the-session-information-in-a-cookie-wont-be-after-page-reload – Munsterlander

+0

@Paul对我的回答有帮助吗? – Webeng

回答

1

是的,有一些简单的方法可以检查用户是否登录,最好的方法是使用超全球性的$_SESSION。当你使用session superglobal时,你基本上是将信息保存到服务器上,并且保存特定用户的信息,同时在用户计算机上保存一个cookie,只要会话有效(通常是30分钟) 。用简单的英语,php开发人员制作了一个超全球化的版本,基本上使开发人员可以非常容易地“维护状态”,而无需执行极端数量的代码。

这就是你将如何使用session superglobal。在您的网站的每一个页面的顶部,你将有代码(甚至高于<!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>"; 
} 
?> 

之前的代码会回显“Hello there John!”之类的东西。如果用户名是John。从这里,你可以在你想要的内容中包含你想要的内容的任何代码,只需要用户登录就可以看到因此,没有登录的用户将无法查看该网站的哪一部分,即使他们会看到这些网站徽标以及其他不在条件内的其他所有内容。此外,以前的代码不一定非要在最上面,只需要<?php session_start(); ?>,这是由于HTTP协议工作原因。

让我知道这是否有帮助,或者如果您有任何其他问题。

+0

好吧,我也试过这个,并且得到以下错误:致命错误:调用第14行第14行中的/home/a4049291/public_html/frontpage.html中的非对象的成员函数prepare()是 - $ stmt = $ connection-> prepare($ sql);新手是否有课程? – Paul

0

Webeng上面的答案有你需要的大部分内容,但是你需要看看你是如何建立数据库连接的,这样你才能正确地使用你准备好的语句。查找PDO或mysqli数据库连接。

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

我会改变他答案的一件事是每页的顶部。我反而利用这一点,因此,如果用户没有在页面加载时,他们被送回登录页面登录:

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