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的主要内容,如果未能解决你的问题,请参考以下文章
tp框架报“mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysq