PHP登录脚本 - 记住我(php login script - remember me)

2019-10-29 17:06发布

任何人都可以看到什么不对的登录脚本:

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;
  }

解释:

目前,该脚本允许通过任何东西。 换句话说,查询返回的传递给它的任何用户名和密码正确。 我已经把echo语句,就像一张支票 - 显然脚本将继续在正常情况下!

我知道,CONNECT类和login_connect方法工作,因为我在工作正常的寄存器脚本中使用它们。 depException仅仅是Exception类的扩展。
该功能登录()是一个包含寄存器,工作正常同一类()的一部分。
我知道这两个变量($ username和$通)越来越向功能,因为echo语句准确地输出它们。 (无需为这部分脚本的$记得变量,它是后来用于记得我的过程)。
我难倒。 请帮忙!

UPDATE

感谢那些响应。 我是越来越糊涂了与该查询返回了什么。 完整的脚本不检查返回多少行,这是那里的检查应该完成的事情。 一切工作现在除了我记得我的功能。 也许有人可以帮助与?!?! 以下是完整的脚本:

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!

感谢您的帮助,我有这个脚本工作的主要部分。 然而,在最后的记得我还是有点想不工作。 可能有人给我一只手梳理出来? $的用户名,$通和$记得都是我以前分配将它们传递给函数保存写$ _ POST [“用户名”]等等,每次短变量名。 $记得是指一个复选框。

Answer 1:

什么是$conn->query()返回时,像一个MySQL资源对象mysql_query()呢? 如果是的话那么它会一直比较“真”。 mysql_query()只返回FALSE如果查询彻底失败了,像它有一个语法错误,或者表不存在。

要检查,如果你有你需要尝试从结果集读取行,看看你得到任何东西任何结果,您的相当于通过任何mysql_fetch_row()是。

重要提示:您的脚本很容易受到SQL注入式攻击 ,甚至只是奇怪的用户名像o'neil与撇号。 你应该逃避查询中所有变量与mysql_real_escape_string()或同等学历),以确保您的查询没有得到通过特殊字符搞砸。 或者,甚至更好,用它看起来像准备好的发言

select * from login where username=? and password=sha1(?)

回复:UPDATE

从表单变量经由任一可用$_GET$_POST ,这取决于被用于提交形式,其方法上。 尝试if (isset($_POST['remember']))以查看是否检查发现复选框。

重要提示:我看到你试图用裸$remember ,看是否被选中复选框。 这表明,我认为你正试图采取的优势register_globals PHP中的功能,让您的GET和POST变量通过常规的变量名访问。 如果是这样的话,你应该注意PHP手册警告!

警告

[ register_globals ]已被弃用PHP 5.3.0和除去PHP 6.0.0的。 依靠这个功能是非常气馁。

使用$_GET$_POST来代替。 我可以告诉你如何做if ($remember)的工作,实际上,但由于固有的邪恶的烦躁register_globals我不会! ;-)



Answer 2:

您所查询的是开放的SQL注入 ...

选择 *
来自用户的
WHERE用户名= ''或'A'= 'A'
和口令= SHA1( 'guessAnyPassword')

我还检查结果,并立足于多少记录被返回的动作。

if (mysql_num_rows($result) > 0)


Answer 3:

在PHP中是否有执行他们的错误大多数查询只返回False。 您的查询返回的值,值可能是一个空数组。 这不是一个假值至于你的if语句而言。

检查有多少行返回。 要做到这一点,将取决于你的抽象层上的功能(连接类等...)



文章来源: php login script - remember me