PHP代码问题 - 登录和注册

时间:2012-01-16 21:26:46

标签: php mysql

我是PHP和MySQL的新手,我使用此代码创建了注册和登录页面。

数据库 dbusers

  • id(PK,Auto Increment,Int(10))
  • 用户名(唯一,Varchar(16))
  • 密码(Varchar(16))
  • 电子邮件(Varchar(45))

以下是 register.php 的代码(使用不相关的表单):     

// dbConfig.php is a file that contains your
// database connection information. This
// tutorial assumes a connection is made from
// this existing file.
include ("dbconfig.php");


//Input validation and the dbase code
if ( $_GET["op"] == "reg" )
{
$bInputFlag = false;
foreach ( $_POST as $field )
{
if ($field == "")
{
$bInputFlag = false;
}
else
{
$bInputFlag = true;
}
}
// If we had problems with the input, exit with error
if ($bInputFlag == false)
{
die( "Problem with your registration info. "
."Please go back and try again.");
}

// Fields are clear, add user to database
// Setup query
$q = "INSERT INTO `dbusers` (`username`,`password`,`email`) "
."VALUES ('".$_POST["username"]."', "
."PASSWORD('".$_POST["password"]."'), "
."'".$_POST["email"]."')";

// Run query
$r = mysql_query($q);

// Make sure query inserted user successfully
if ( !mysql_insert_id() )
{
die("Error: User not added to database.");
}
else
{
// Redirect to thank you page.
Header("Location: register.php?op=thanks");
}
} // end if


//The thank you page
elseif ( $_GET["op"] == "thanks" )
{
echo "<h2> Thanks for registering!</h2> ";
}

// EOF
?>

login.php 的代码(处理表格@另一个不相关的文件):

<body>

    <?php
    session_start();
    // dBase file
    include ("dbconfig.php");

    if ($_GET["op"] == "login")
    {
    if (!$_POST["username"] || !$_POST["password"])
    {
    die("You need to provide a username and password.");
    }

    // Create query
    $q = "SELECT * FROM `dbusers` "
    ."WHERE `username`='".$_POST["username"]."' "
    ."AND `password`=PASSWORD('".$_POST["password"]."') "
    ."LIMIT 1";

    // Run query
    $r = mysql_query($q);

    if ( $obj = @mysql_fetch_object($r) )
    {
    // Login good, create session variables
    $_SESSION["valid_id"] = $obj->id;
    $_SESSION["valid_user"] = $_POST["username"];
    $_SESSION["valid_time"] = time();

    // Redirect to member page
    Header("Location: home.php");
    }

    else
    {
    // Login not successful
    die("Sorry, could not log you in. Wrong login information.");
    }
    }
    ?>

</body>

我的第一页上的开头代码 home.php

<body>

<?php
    session_start();

    if (!$_SESSION["valid_user"])
    {
    // User not logged in, redirect to login page
    Header("Location: login.html");
    }

    // Display Member information
    echo "<p>User ID: " . $_SESSION["valid_id"];
    echo "<p>Username: " . $_SESSION["valid_user"];
    echo "<p>Logged in: " . date("m/d/Y", $_SESSION["valid_time"]);
?>

<div id="MENUBAR">
<ul id="LINKS" class="MenuBarHorizontal">
    <li><a class="MenuBarItemSubmenu">Clientes</a>
      <ul>

现在问题:

1)和$ _SESSION [“valid_id”] = $ obj-&gt; id做什么是“ - &gt;”符号,为什么它指向id(@ login.php )?

 if ( $obj = @mysql_fetch_object($r) )
        {
        // Login good, create session variables
        $_SESSION["valid_id"] = $obj->id;
        $_SESSION["valid_user"] = $_POST["username"];
        $_SESSION["valid_time"] = time();

2)为什么我一直无法登录?在上述数据库中成功创建(和写入)了多个用户,但我仍然得到相同的错误......

提前致谢。

亚历。

3 个答案:

答案 0 :(得分:0)

1)
这些行验证是否可以从之前编写的SQL查询中找到登录名。如果是这样,则会将一些值添加到当前会话中。 ->是一个对象操作符 - 它使您可以访问对象方法和变量。在这种情况下,您的对象是$obj,并且它正在访问该对象中名为id的变量。

如果您习惯使用其他OOP语言,那么它将等同于这样的结构:
int MyId = MyObject.id;

2)
可能有很多原因。首先,脚本易受SQL注入攻击。其次,您还没有告诉用户是如何创建的。您的SQL查询告诉我们您的密码应该通过MySQL的密码()函数传递 - 您是否以相同的方式创建了用户的密码?

检查SQL查询是否会产生任何结果的一种简单方法是将其回显,复制并粘贴到数据库中(即通过phpMyAdmin)。如果是这样,问题出在您的代码中。

<强>更新
Sergiy T.指出在输出发送到浏览器之后已经放置了session_start()。由于您尚未收到有关此事件的警告,因此您可能未启用错误报告。在开发过程中,这应该是开启的 重要的是,session_start()放在任何输出之前(甚至是空格)。

一路上的提示 - 停止使用@运营商的错误;这可能会在开发过程中揭示您的问题。

再次 - 确保您的脚本不易受SQL注入攻击!

答案 1 :(得分:0)

- &gt;语法用于PHP对象。 id是$ obj的一部分,您可以使用 - &gt;访问它语法。

至于它为什么不起作用,我没有看到任何明显的东西,但是你的代码存在很多问题。对于初学者,您以明文形式存储密码,而您没有清理表单中的输入。这使您对SQL注入存在巨大问题,并且只是对您的代码的两个最简单和最明显的攻击。<​​/ p>

实施身份验证很难,不建议任何单独工作的开发人员使用。没有充分的理由在这里重新发明轮子,有很多好的免费选项可以集成到你拥有的任何项目中。我喜欢symfony框架,但周围还有很多其他框架。

答案 2 :(得分:0)

第一个问题已有答案。

对于第二个问题 - 有可能进行sql注入。可能有人只是选择了带有“或”的用户名或密码。

session_start()可能出现问题(请查看http://php.net/manual/en/function.session-start.php

  

要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start()。