如果$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";
}
?>
如果有人可以帮助我,那将是非常好的,任何修复都将非常感激。
答案 0 :(得分:1)
你应该使用PHP的PDO或MySQLi而不是弃用的mysql_ *函数。
注意:使用PHP PDO,您的参数将自动转义。
除非你绝对需要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;
答案 1 :(得分:0)
尝试:
if ( $result ) {
$count = mysql_num_rows( $result );
}
而不是:
if ( $sql ) {
$count = mysql_num_rows( $sql );
}
答案 2 :(得分: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()
很快就会被弃用。参见官方文档。
答案 3 :(得分:0)
试一试
if ( !$result ) {
die( mysqli_error() );
} else {
// check if $result row == 1
if ( mysqli_num_rows( $result ) == 1 ) {
// do stuff here
}
}
如前所述,使用 mysqli _ ,因为 mysql _ 的开发已停止。 Read More