Php Login / Mysql 检查 mysql 不适用于 SHA512

Posted

技术标签:

【中文标题】Php Login / Mysql 检查 mysql 不适用于 SHA512【英文标题】:Php Login / Mysql checking against mysql is not working with SHA512 【发布时间】:2011-10-23 07:34:03 【问题描述】:

目标:尝试创建登录。注册页面使用它来根据输入创建用户名和密码:

注册

 <?php
$host="localhost"; // Host name 
$username="root"; // mysql username 
$password=""; // Mysql password 
$db_name="dbname"; // Database name 
$tbl_name="Student"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

/* Obliterate bad input */
$secUser = mysql_real_escape_string($_POST['reguser']);
$badpasses = $_POST['regpass'];
$salt = '~Z`!@#$%I^&*()_-+Q=][\|"><';
$secPass = hash('sha512', $badpasses.$salt);

$sql= "INSERT INTO Student (uname, upass, fname, lname, email, currGrade)                VALUES('$secUser','$secPass','$_POST[regfirst]','$_POST[reglast]','$_POST[regemail]','$_POST[regclas-s-rank]')";

$result = mysql_query($sql);
if (!$result) 
    die('Invalid query: ' . mysql_error());

else
echo "Registered";


?>

Login.php

<?php
ob_start();
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="dbname"; // Database name 
$tbl_name="Student"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// Define $myusername and $mypassword 
$salt = '~Z`!@#$%I^&*()_-+Q=][\|"><';
$myusername = $_POST['uname']; 
$mypassword = $_POST['upass'];
$mypassword = hash('sha512', $mypassword.$salt);

$sql = "SELECT * FROM $tbl_name WHERE uname = '$myusername' AND upass = '$mypassword')";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1)
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("regduser");
session_register("regdpass"); 
header("location:login_success.php");

else 
echo "$mypassword<br />";
echo "Wrong Username or Password";


ob_end_flush();
?>

我得到的错误是Wrong User or Pass,但我尝试登录时的密码是:

bffbc4f94f40d0cece6774ed9ec792b03ad5362edf768d190913d033c46ad4af4e2cbe1d42134f58da402efb7d3209b7e9b62ff3e81caf6341262b24dd300e9a

数据库中用户poop和数据库中密码poop的密码是:

4e4d252a08ac4c35c2917b4fc715fef13bac2b686c7ebc8f8256765bd584a89634df3fa455ed73c1fbec84d442f11d5e064749396dcb1c0f1525f82c1b0ea57a

为什么这些密码不同?!有人可以帮忙吗?

【问题讨论】:

我向您使用哈希表示敬意,但正如@Pelshoff 下面所说,您遇到了一个更基本的问题,即 sql-injection。但是,只要您知道您当前的实现还没有准备好提供给任何不受信任的人,那么在测试您将修补(可能是通过参数化查询)之前有 sql 注入漏洞是很好的,然后再将代码发布到野外。 【参考方案1】:

应该

// Define $myusername and $mypassword 
$salt = '~Z`!@#$%I^&*()_-+Q=][\|"><';
$myusername = $_POST['uname']; 
$mypassword = $_POST['upass'];
$mypassword = hash('sha512', $mypassword);

不是

// Define $myusername and $mypassword 
$salt = '~Z`!@#$%I^&*()_-+Q=][\|"><';
$myusername = $_POST['uname']; 
$mypassword = $_POST['upass'];
$mypassword = hash('sha512', $mypassword.$salt);

?

您在注册时将盐添加到密码哈希中,但在尝试登录时不会添加它。

我还想强烈敦促您不要直接 POST 到您的数据库查询中,而是对查询中使用的每个 POST 变量使用 mysql_real_escape。最好还是使用准备好的语句。

这有帮助吗?

【讨论】:

确实如此。可能存在 SQL 注入。看看下面的 xkcd:xkcd.com/327. @Shi:xkcd 漫画,虽然既有趣又有教育意义,但不适用于这里。 mysql_query 只能运行一个查询,所以这种利用是不可能的;)(虽然这段代码还有其他的,同样“有趣”的可能性)。例如,假设我将尝试使用用户名' OR 1-- 登录 @Mchl 一旦你找到一个有效的用户名,你就可以使用Robert"; --登录。 @Mchl 代码检查mysql_num_rows() == 1,因此如果没有有效的用户名,您的建议将失败。 是的...他实际上正在检查等于 1 的行数...这使他免于我的微不足道的尝试;P【参考方案2】:

我没有看到您的登录脚本中使用了“盐”的位置。不妨试试以下方法:

$mypassword = hash('sha512', $mypassword . $salt);

【讨论】:

【参考方案3】:

您的 $_POST['upass']; 变量为空。检查您的表单字段是否实际称为upass

根据这条信息:

>> $salt = '~Z`!@#$%I^&*()_-+Q=][\|"><';
'~Z`!@#$%I^&*()_-+Q=][\\|"><'

>> hash('sha512', 'poop'.$salt);
'4e4d252a08ac4c35c2917b4fc715fef13bac2b686c7ebc8f8256765bd584a89634df3fa455ed73c1fbec84d442f11d5e064749396dcb1c0f1525f82c1b0ea57a'

>> hash('sha512', ''.$salt);
'bffbc4f94f40d0cece6774ed9ec792b03ad5362edf768d190913d033c46ad4af4e2cbe1d42134f58da402efb7d3209b7e9b62ff3e81caf6341262b24dd300e9a'

【讨论】:

以上是关于Php Login / Mysql 检查 mysql 不适用于 SHA512的主要内容,如果未能解决你的问题,请参考以下文章

PHP相交与MySQL相交

简单的 MySQL 登录系统(login.php)[关闭]

jdbc连接mysq之serverTimezone设定

mysql约束检查产生错误

使用 PHP 检查页面是不是被 SSL 访问

tp框架报“mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysq