php登录脚本-记得我吗

php登录脚本-记得我吗,php,mysql,oop,login-script,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

是否有人看到此登录脚本有任何错误:

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\u connect
方法正在工作,因为我在一个运行良好的注册脚本中使用了它们。depException只是Exception类的扩展。
函数login()是包含register()的同一类的一部分,该类工作正常。
我知道这两个变量($username和$pass)正在进入函数,因为echo语句正在准确地输出它们。(脚本的这一部分不需要$MEMORE变量。它稍后将用于“记住我”过程)。
我被难住了。请帮忙

使现代化 谢谢你的回复。我对查询返回的内容感到困惑。完整的脚本会检查返回的行数,这是应该进行检查的地方。除了我的“记住我”功能外,所有功能都正常工作。也许有人能帮上忙?!?!以下是完整的脚本:

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和$memory都是我在每次将它们传递给函数以保存写入$\u POST['username']等之前指定的短变量名$请记住,引用了一个复选框。

您的查询已打开供

从用户中选择*
,其中 用户名=''或'a'='a'
密码= sha1(“guessAnyPassword”)

我还将检查您的结果,并根据返回的记录数进行操作

if (mysql_num_rows($result) > 0)

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

要检查是否得到了任何结果,您需要尝试从结果集中获取一行,并查看是否得到了任何结果,无论您的等价物是什么

重要提示:您的脚本容易受到诸如带有撇号的
o'neil
等奇怪用户名的攻击。您应该使用(或等效项)转义查询中的所有变量,以确保查询不会被特殊字符弄乱。或者,更好的是,使用事先准备好的语句

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

Re:UPDATE

表单中的变量可通过
$\u GET
$\u POST
获得,具体取决于提交表单时使用的方法。尝试
if(设置($\u POST['memory'])
查看是否选中了该复选框

重要提示:我看到您尝试使用裸
$memory
查看复选框是否已选中。这对我来说意味着您正试图利用PHP中的特性,该特性使GET和POST变量可以通过常规变量名访问。如果是这种情况,您应该注意PHP手册中的警告

警告 [
register\u globals
]从PHP 5.3.0开始就被弃用,从PHP 6.0.0开始被删除。非常不鼓励依赖此功能


改用
$\u GET
$\u POST
。实际上,我可以告诉你如何使
if($memory)
工作,但考虑到
register\u globals的固有邪恶性,我不打算

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


检查返回了多少行。实现这一点的函数将取决于您的抽象层(连接类等)。

您能否给我提供更多信息,或指导我如何使用准备好的语句防止SQL注入攻击?谢谢muso-John和我都包含了有关SQL注入的链接。别担心John,我没有使用register_globals。在将变量传递给函数之前,我分配了较短的名称:$username=strip_标记(trim($_POST['username'])$通过=去除标签(修剪($_POST['password'])$记住=$\u POST['rememberMe'];你能告诉我现在怎么修吗?!;-)