Php 我的MySQL会话赢了';开始
如果Php 我的MySQL会话赢了';开始,php,html,mysql,Php,Html,Mysql,如果$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( $myu
$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";
}
?>
试试:
而不是:
if ( $sql ) {
$count = mysql_num_rows( $sql );
}
看,一定是这样的:
$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\u query()
,因为mysql\u query()
很快就会被弃用。见官方文件。试一试
if ( !$result ) {
die( mysqli_error() );
} else {
// check if $result row == 1
if ( mysqli_num_rows( $result ) == 1 ) {
// do stuff here
}
}
如前所述,请使用mysqli,因为对mysql的开发已经停止 您真的应该使用PHP的PDO或MySQLi,而不是不推荐使用的mysql_*函数
注意:使用PHP PDO,您的参数将自动转义
见:
除非您绝对需要SHA1,否则您将首先查找用户,然后挑战存储的密码哈希。由于一些散列算法(如Bcrypt)无法与简单的字符串比较一起工作,因此这种方法的可移植性要高得多
这就引出了我的下一点:不要使用快速散列算法(SHA、MD5等)进行密码散列。这些散列算法用于快速散列大量数据,这意味着攻击者可以快速为密码等小数据生成反向查找表。诸如Bcrypt、Scrypt、pbkdf2等算法是专门的散列算法的好例子,这些算法的设计速度较慢或更难为其生成查找表
除非您已打开,否则不应使用条带斜杠。如果您对PHP不熟悉,请不要在使用类似的现代替换时使用陈旧的mysql\u query
界面。你最好花点时间熟悉一下密码,这样你就不必重新发明轮子了。另外,你做的密码加密是完全错误的。如果您使用的是SHA1,则必须使用加密盐。我还强烈建议您使用基于Bcrypt的解决方案,而不是SHA1。当有人获取您的数据库副本时,您的首选项是不相关的。像这样的参考资料可以帮助你避免犯这些错误。好的,塞巴斯蒂安,谢谢,但是你看,这只是给洛克兰指明方向。整个代码太原始了,没有必要修改,必须重新考虑、重新思考并正确地重做:)那么你真的不应该使用mysql\u*
,而是mysqli\u*
或PDO;)正如你所看到的,我提到了它,“顺便说一句,移动到mysqli_query(),因为mysql_query()很快就会被弃用。请参阅官方文档。”这已经奏效了,但现在所有的DEO都会出现未知用户,这是行计数的另一个。这就是它为我工作的领域。确保示例用户存在,或者您正在删除我的示例变量。示例用户行:插入用户
(用户名
,密码
)值('foo','40bd001563085fc35165329ea1f5c5ecbdbbeef');
if ( !$result ) {
die( mysqli_error() );
} else {
// check if $result row == 1
if ( mysqli_num_rows( $result ) == 1 ) {
// do stuff here
}
}
// run login script
$_SESSION['user_id'] = $row->id;
// redirect to an authenticated page
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;