2

$count如果等于 1 但不等于 1,我的 MySQL 会话将开始,我不知道如何修复它,我对 php 相当陌生,我更喜欢使用 sha1 而不是 BCrypt

  <?php
     //login form
     mysql_connect("xxxxx","xxxxxx","xxxxxx") or die( mysql_error() );
     mysql_select_db("u940004575_chat");

     $myusername = stripslashes( $myusername );
     $mypassword = stripslashes( $mypassword );
     $sha1mypassword = sha1( $mypassword );
     $myusername = mysql_real_escape_string( $myusername );
     $mypassword = mysql_real_escape_string( $mypassword );
     $sha1mypassword = mysql_real_escape_string( $sha1mypassword );
     $sql = mysql_query("SELECT id FROM users WHERE username='$myusername' and         password='$sha1mypassword'")or die( mysql_error() );
     $result = mysql_query( $sql );

     if ( $sql ) {
         $count = mysql_num_rows( $sql );
     }

     if ( $count == 1 ) {
        session_register("myusername");
        session_register("mypassword"); 
        header("location:home.php");
     } else {
        echo "Wrong Username or Password";
     }
?>

如果有人可以帮助我,那就太好了,任何修复都将不胜感激。

4

4 回答 4

1

您真的应该使用 PHP 的 PDO 或 MySQLi 而不是已弃用的 mysql_* 函数。

注意:使用 PHP PDO 您的参数会自动转义。

请参阅:PHP doc 上的此通知

除非您绝对需要 SHA1,否则您需要先寻找用户,然后再挑战存储的密码哈希。这更便于移植,因为一些散列算法(例如 Bcrypt)不能用于简单的字符串比较。

这让我想到了下一点:不要使用 FAST 散列算法(SHA、MD5 等)进行密码散列。这些散列算法旨在快速散列大量数据,这意味着攻击者可以快速为密码等小数据生成反向查找表。Bcrypt、Scrypt、pbkdf2 等算法是专门的散列算法的好例子,这些算法被设计为更慢或更难生成查找表。

<?php
    session_start()
    $myusername = 'foo';
    $mypassword = '123';

    try {
       $pdo = new PDO('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE, DB_USERNAME, DB_PASSWORD);
       $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch ( PDOException $e ) {
       die ('ERROR: ' . $e->getMessage() );
    }

    $query = 'SELECT id, password FROM users WHERE username = :username';
    $params = array('username' => $myusername);

    $stmt = $pdo->prepare( $query );
    $stmt->execute( $params );

    // user not found?
    if ( ! $stmt->rowCount() ) {
       die ('unknown user');
    }

    $row = $stmt->fetch( PDO::FETCH_OBJ );

    // challenge password hash
    if ( $row->password == sha1( $mypassword ) ) {
       // success!
       header("location:home.php");
    } else {
       die ('wrong password');
    }

编辑:

还要确保您正在使用session_start()开始会话。这将允许您使用 $_SESSION 超全局变量在 PHP 后端存储会话变量。

// run login script

$_SESSION['user_id'] = $row->id;

// redirect to an authenticated page

然后在所有经过身份验证的页面上,您可以按 ID 查询/缓存用户并获取包含所有当前用户数据的用户对象

    session_start()
    // make sure logged in

    if ( ! $_SESSION['user_id'] ) {
       // not logged in
       // redirect to login
       die ('not logged in');
    }       
    $query = 'SELECT * FROM users WHERE id = :id';
    $stmt = $pdo->prepare( $query );
    $stmt->execute( array('id' => $_SESSION['user_id'] ) );

    $user = $stmt->fetch( PDO::FETCH_OBJ );
    print 'Hello, ' . $user->username;
于 2013-09-26T23:25:36.430 回答
0

尝试:

if ( $result ) {
    $count = mysql_num_rows( $result );
}

代替:

if ( $sql ) {
    $count = mysql_num_rows( $sql );
}
于 2013-09-26T22:55:55.133 回答
0

看,一定是这样的:

 $sql = "SELECT id FROM users WHERE username = '$myusername' and password = '$sha1mypassword'";
 // you defined the sql query

 $result = mysql_query( $sql );
 // now you executed it and have the result

 // and you can go on with this result
 if ( $result ) {
     $count = mysql_num_rows( $result );
 }

顺便说一句,移到mysqli_query(),因为mysql_query()很快就会被弃用。请参阅官方文档。

于 2013-09-26T23:03:50.797 回答
0

试一试

if ( !$result ) {
   die( mysqli_error() );
} else {
    // check if $result row == 1
    if ( mysqli_num_rows( $result ) == 1 ) {
        // do stuff here
    }
}

如前所述,使用mysqli_因为 mysql_ 的开发已经停止。阅读更多

于 2013-09-26T23:20:46.717 回答