0

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

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 语句作为检查 - 显然脚本将在正常情况下继续!

我知道连接类和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 指的是一个复选框。

4

3 回答 3

4

$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(?)

回复:更新

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

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

警告

[ register_globals] 自 PHP 5.3.0 起已弃用,自 PHP 6.0.0 起已删除。强烈建议不要依赖此功能。

使用$_GETand$_POST代替。实际上,我可以告诉你如何制作作品,但考虑到我不会去做if ($remember)的内在邪恶!register_globals;-)

于 2009-07-08T18:45:30.030 回答
3

您的查询对sql-injections开放...

SELECT *
FROM users
WHERE username = ' ' OR 'a' = 'a '
AND password = sha1(' guessAnyPassword ')

我还会检查您的结果,并根据返回的记录数采取行动。

if (mysql_num_rows($result) > 0)
于 2009-07-08T18:41:37.697 回答
0

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

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

于 2009-07-08T18:46:57.687 回答