1

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

<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?

4

3 回答 3

1

您可以将一个额外的字段放在登录表名称“角色”中。

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

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

你明白我的意思了吗?或任何查询?

于 2013-03-27T03:25:02.583 回答
1

是的。使用如下所示的查询查询具有给定用户名和密码的人的数据库:

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

如果它产生任何行,则用户存在,你应该让他们进入。如果没有行,那么用户名和密码的组合是无效的,你不应该让他们进入。

这是基础,但如果你真的要把它投入生产,你会想要做更多的改变:

  • 适当地转义您放入查询中的数据或使用准备好的查询。照原样,您的代码容易受到SQL 注入攻击。比如说,我尝试创建一个用户名或密码中带有撇号的帐户。你的代码会坏掉。这也可能被用于恶意手段,所以你真的应该修补它。

    修补它的最简单方法是在将其放入查询之前转义所有内容,例如使用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。

于 2013-03-27T02:51:33.790 回答
1

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

         if (!isset($_SESSION['AuthId'])) {
         header('Location:Login.php');
         exit;
         }
于 2013-03-27T03:12:47.077 回答