php登录脚本 - 记住我

时间:2009-07-08 18:38:22

标签: php mysql oop login-script

任何人都可以看到此登录脚本有任何问题:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  } else {
    echo $username, $pass;
  }

解释:

目前剧本允许任何通过。换句话说,对于传递给它的任何用户名和密码,查询返回true。 我把echo语句作为一个检查 - 显然脚本会在正常情况下继续!

我知道connect类和login_connect方法正在运行,因为我在一个工作正常的寄存器脚本中使用它们。 depException只是Exception类的扩展 函数login()是包含工作正常的register()的同一个类的一部分 我知道这两个变量($ username和$ pass)正在进入函数,因为echo语句正在准确地输出它们。 (脚本的这一部分不需要$ remember变量。以后用它来记住我的过程。) 我很难过。请帮忙!

更新

感谢您的回复。我对查询返回的内容感到困惑。完整的脚本会检查返回的行数,这是检查应该完成的位置。现在一切都在工作,除了我记得我的功能。也许有人可以帮忙吗?!?!这是完整的脚本:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  }       
  if ($result->num_rows>0) {
    $row = $result->fetch_assoc();
    //assign id to session
    $_SESSION['user_id'] = $row[user_id];        
    // assign username as a session variable
    $_SESSION['username'] = $username;        
    // start rememberMe
    $cookie_name = 'db_auth';
    $cookie_time = (3600 * 24 * 30);*/ // 30 days
    // check to see if user checked box
    if ($remember) {
      setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
    }
    // If all goes well redirect user to their homepage.
    header('Location: http://localhost/v6/home/index.php');   
  } else {
    throw new depException('Could not log you in.);
  }
}

非常感谢你的帮助。

更新2!

感谢您的帮助,我已经掌握了此脚本的主要部分。但是,记住我最后的一点仍然不想工作。 有人可以帮我解决一下吗? $ username,$ pass和$ remember都是我在将它们传递给函数之前分配的短变量名,以便每次都保存写入$ _POST ['username']等。 $ remember指的是一个复选框。

3 个答案:

答案 0 :(得分:4)

$conn->query()返回什么,像mysql_query()这样的MySQL资源对象呢?如果是这样,它将始终比较“真实”。如果查询完全失败,mysql_query()仅返回FALSE,例如语法错误或表不存在。

要检查您是否有任何结果,您需要尝试从结果集中获取一行,看看您是否获得了任何内容,通过mysql_fetch_row()的等效内容。

重要提示:您的脚本容易受SQL injection attacks攻击,甚至只有奇怪的用户名如o'neil和撇号。您应该使用mysql_real_escape_string()(或等效的)转义查询中的所有变量,以确保您的查询不会被特殊字符弄乱。或者,更好的是,使用看似

的预准备语句
select * from login where username=? and password=sha1(?)

重新:更新

表单中的变量可通过$_GET$_POST获得,具体取决于用于提交表单的方法。请尝试if (isset($_POST['remember']))查看是否已选中该复选框。

重要提示:我发现您尝试使用裸$remember来查看复选框是否已选中。这告诉我你正在尝试利用PHP中的register_globals功能,它可以通过常规变量名访问你的GET和POST变量。如果是这种情况,您应该注意PHP手册中的警告!

  

警告

     

[register_globals]自PHP 5.3.0起已被弃用,自PHP 6.0.0起已被删除。非常不鼓励依赖此功能。

改为使用$_GET$_POST。实际上,我可以告诉你如何让if ($remember)工作,但考虑到register_globals的内在邪恶,我不会这样做! ; - )

答案 1 :(得分:3)

您的查询已针对sql-injections ...

开放
  

SELECT *
FROM users
WHERE   username =''或'a'='a '
  和密码=   SHA1( '的 guessAnyPassword ')

我还会检查您的结果,并根据返回的记录数量确定操作。

if (mysql_num_rows($result) > 0)

答案 2 :(得分:0)

在php中,如果执行错误,则大多数查询仅返回False。您的查询返回一个值,可能是一个空数组值。就if语句而言,这不是假值。

检查返回的行数。执行此操作的功能取决于您的抽象层(连接类等...)