2013-03-27 117 views
1

我正在尝试创建一个只能由注册用户访问的用户和信息的网页。是否可以限制未注册用户可以看到的文件?如果是这样,怎么样?我已经在index.php中有一个连接了MySQL数据库。这是我到目前为止:如何在给予注册用户完全访问权限的同时限制未注册用户的访问?

<head></head> 
<body> 
    <h3>Signup Here:</h3> 
     <form method="post" action="userindex.php"> 

       Please enter user name: <input type="text" name="username" value="" /><br /> 
       Please enter password: <input type="password" name="password" value="" /> 
       <br /> 
       <input type="submit" value="Submit"/> 



     </form> 
</body> 

<?php 
include ("dbroutines.php"); 

if (isset($_POST['username'])) { 


    if ($_POST['username']>'' && $_POST['password']>'') { 
     $q="insert into users (Name, Password) values ('".$_POST['username']."', '".$_POST['password']."')"; 
     echo 'query='.$q; 
     $conn=db_connect(); 
     $result=$conn->query($q); 
     echo '<br />xxx'.$conn->error."xxx"; 
     unset($_POST['username']); 
     unset($_POST['password']); 
    } else { 
     echo 'Please enter both username AND password!'; 
    } 

} 

$q="select Name, Password from users"; 
$conn=db_connect(); 
$result=$conn->query($q); 
echo 'xxx'.$conn->error."xxx"; 
if ($result){ 




      echo '<hr />'; 
      for ($count=0; $row=$result->fetch_row(); ++$count) { 
       echo $count." Name=".$row[0]." password=".$row[1].'<br />'; 

      } 
      echo '<b style="color:red;">there are '.$count.' users in your database!'.'</b><hr />'; 
} 

由此,你可以指定什么样的用户可以访问某些文件,如userindex.php?

+0

我不明白你的观点。你想在登录后给你的网站访问权限吗?你想要什么?你能再解释一次吗? – chintan 2013-03-27 02:51:33

+0

我想要的是能够让客户端(未登录)对网站上的文件进行有限的访问,而同一用户在登录时可以访问网站上的文件。 – Max 2013-03-27 03:07:24

回答

1

我认为验证用户不是傻瓜证明的解决方案。您必须在会话中保留一个令牌才能记住该用户是注册用户。您必须创建一个通用的php页面,名为Security.php,您将放置以下代码,因为智能用户可以直接输入URL并访问您的机密页面。您需要将此页面包含在您想要保护的每个php页面的顶部。

  if (!isset($_SESSION['AuthId'])) { 
     header('Location:Login.php'); 
     exit; 
     } 
+0

非常感谢你 – Max 2013-03-27 03:16:08

1

是的。使用查询,将是这个样子查询数据库有人给定的用户名和密码。

select * from users where Name = 'john.doe' and Password = 'hunter2' limit 1 

如果产生任何行,用户存在,你应该让他们如果没有行,那么COM ­斌­一个­重刑的用户名和密码是无效的,你不应该让他们进来。

这是基础知识,但是如果你确实打算把这个投入生产,你会想做一些更改:

  • 正确地转移您在查询中放入的数据或使用准备好的查询。原样,您的代码易受到SQL injection攻击。比如说,我试图在用户名或密码中用撇号创建一个帐户。你的代码会中断。这也可以用于恶意手段,所以你真的应该修补它。

    修补它的最简单方法是,在将其放入查询之前,使用例如mysql_real_escape_string将其解决。这可能会工作,但更好(因为整个mysql_函数家族已被弃用)将使用准备好的查询和PDO,如下所示。

  • 哈希和加密你的密码,这样一个数据库的妥协(如果上面的漏洞没有被修补,这可能会很容易发生)不会泄露所有的密码。然后

您的代码可能是这样的:

// You'd probably want to put these in a separate configuration file. 
$db = new PDO('mysql:dbname=test', 'my_mysql_user', 'hunter2'); 

// Make any errors throw an exception. 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$query = $db->prepare('select * from users where Name = :name limit 1'); 
$query->bindValue(":name", $_POST['username'], PDO::PARAM_STR); 
$row = $query->fetch(PDO::FETCH_ASSOC); 

if($row === FALSE) { 
    // User not in the database; don't let them in. 
} 

$calculatedHash = hash("sha512", $row['PasswordSalt'] . $_POST['password']); 
if($calculatedHash === $row['PasswordHash']) { 
    // Password's right. Let them in. 
}else{ 
    // Password's wrong. Keep them out. 
} 

进一步的改进是使用,也就是说,bcrypt而不是咸鱼SHA-512。

1

您可以将一个额外的字段放在loggin表名'角色'中。

每个登录时间。检查它是否是主用户,然后它可以访问更多的访问权限。

如果是额外的用户,则限制访问。

你明白了吗?或者任何查询?

+0

我明白你的意思 – Max 2013-03-27 03:26:40