1

我正在使用 php 进行登录系统。登录和注册本身可以工作,但我在登录后,页面使用 php 打印一个带有隐藏的用户名和密码输入的 html 表单,提交按钮将这些输入发布到“配置文件”php页面,它显示来自该用户的消息,并允许用户发布新消息。登录.php:

<html>
<head>
<title>Login</title>
<?php
if(isset($_POST['submit1'])){
    $canconnect=false;
    $user_name="root";
    $password="";
    $database="users";
    $server="localhost";
    $user=$_POST['username'];
    $pass=$_POST['pass'];
    $db_handle=mysql_connect($server,$user_name,$password);
    $db_found=mysql_select_db($database,$db_handle);
    if($db_found){
        $SQL="SELECT * FROM users";
        $result=mysql_query($SQL);
        while($db_field=mysql_fetch_assoc($result)){
            if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
                $canconnect=true;
            }
        }
        mysql_close($db_handle);
        if($canconnect){
            print("Welcome, ".$user."<br><form name='ftoprof' method='post' action='profile.php'><input type='hidden' name='hiduser' value='<?php echo $user;?>'/><input type='hidden' name='hidpass' value='<?php echo $pass;?>'/><input type='submit' name='profsub' value='View Profile'/></form>");
        }else{
            print("Username or password incorrect, please try again.");
        }
    }else{
        print("Users Database not found.");
        mysql_close($db_handle);
    }
}else{
    print("Enter Username and corresponding Password.");
}
?>
</head>
<body>
<form name="form1" method="post" action="login.php">
<input type="text" name="username" value="User"/>
<input type="text" name="pass" value="password"/>
<input type="submit" name="submit1" value="Submit"/>
</form>
Don't have an account? <a href="signup.php">Sing Up</a>
</body>
</html>

我不知道问题出在此处还是在 profile.php 上:

<html>
<head>
<title>Profile</title>
<?php
if(isset($_POST['profsub'])){
$user=$_POST['hiduser'];
$pass=$_POST['hidpass'];
$canconnect=false;
$username="root";
$password="";
$server="localhost";
$database="users";
$db_handle=mysql_connect($server,$username,$password);
$db_found=mysql_select_db($database,$db_handle);
if($db_found){
    $SQL="SELECT * FROM users";
    $result=mysql_query($SQL);
    while($db_field=mysql_fetch_assoc($result)){
    if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
        $canconnect=true;
    }
    }
    $SQL="SELECT * FROM messages";
    $result=mysql_query($SQL);
    while($db_field=mysql_fetch_assoc($result)){
    print($db_field['message']."<br><br>");
    }if($canconnect){
    print("<form name='mesform' method='post' action='profile.php'><input type='hidden' name='user' value='<?php echo $user; ?>'/><input type='text' name='message' value='message'/><input type='submit' name='messub' value='submit'/></form>");
    }
}else{
    print("Database not found");
}
}elseif(isset($_POST['messub'])){
$mes=$_POST['message'];
$user=$_POST['user'];
$server="localhost";
$username="root";
$password="";
$database="users";
$db_handle=mysql_connect($server,$username,$password);
$db_found=mysql_select_db($database,$db_handle);
if($db_found){
        $SQL="INSERT INTO messages (User, Message) VALUES ('{$user}','{$mes}')";
        $result=mysql_query($SQL);
    }else{
        print("Database not found");
    }

}else{
print("No user's profile to display");
}
?>
</head>
<body>
</body>
</html>

我在登录页面输入用户名和密码,它会弹出一个按钮,上面写着“查看个人资料”。用户数据库表有用户名密码电子邮件和电源(管理员)。Messages db 表只有 Message 和 User(发布它)。当我单击“查看个人资料”按钮时,它会将我带到个人资料页面,但该页面上什么也没有显示,我不知道问题是什么,我不知道会导致什么情况在这。请告诉我我需要对我的代码做些什么才能使其工作。顺便说一句,我正在我的计算机上运行一个带有 wamp 的“服务器”,因此我使用了 localhost。这是我的第一个 php 项目,所以我没想到在没有任何帮助的情况下第一次尝试就完美,是的,我意识到密码使用文本我会改变它,如果我让它工作(输入类型 =“密码”

4

2 回答 2

2
print("Welcome, $user <br><form name='ftoprof' method='post' action='profile.php'><input type='hidden' name='hiduser' value='$user'/><input type='hidden' name='hidpass' value='$pass'/><input type='submit' name='profsub' value='View Profile'/></form>");

替换后的行

if($canconnect){ 

上面的行可能会解决问题

于 2012-09-18T15:57:09.787 回答
1

请!出于对安全的热爱,请勿使用此代码!

正如@TimG 在评论“PDO,PDO,PDO”中所说

只是为了帮助教育你,让我提一下这段代码的两个主要问题:

问题1

此 select 语句询问所有用户,然后在他们之间循环。数据库查询应该使用一个WHERE子句来限制它移动的数据量。

$SQL="SELECT * FROM users";
while($db_field=mysql_fetch_assoc($result)){
  if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
      $canconnect=true;
  }
}

ISSUE2真正的杀手:

$SQL="INSERT INTO messages (User, Message) VALUES ('{$user}','{$mes}')";

这是等待发生的 SQL 注入攻击。您可以在该术语上搜索更多信息,但简而言之——SQL 注入攻击是最常见、最简单和最危险的漏洞之一。从字面上看,这段代码是通往数据库其余部分的大门。

问题 3纯文本密码

以纯文本形式存储密码是一个非常糟糕的主意。这里有很多关于如何加盐和加密密码的讨论。

如果您要学习 PHP 中的数据库编程,请避免学习垃圾的心痛,并从一开始就学习 PDO 和安全性。

于 2012-09-18T19:20:03.420 回答