INSERT INTO后出错

时间:2012-08-02 09:41:36

标签: php mysql

我有以下代码:

$salt=uniqid(mt_rand(), false);
#Add data to tables
mysql_query("INSERT INTO accounts VALUES('$user', '".hash('sha512',$pass+$salt)."', '$salt', '$cookie_value')");
mysql_query("INSERT INTO passwordreset VALUES('$user', NULL, NULL)");
#cookie creation
#.....
#cookie update
mysql_query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$user'");

我使用这些函数清理表单中的数据:

$var = htmlentities($var, ENT_QUOTES, "UTF-8");
return mysql_real_escape_string($var);

今天我登录phpMyAdmin,我看到所有用户的密码和盐是相同的。 不要提醒我关于弃用的mysql_ *我知道,这只是快速草稿。

4 个答案:

答案 0 :(得分:3)

PHP中的字符串连接使用.而非+。因此:

hash('sha512',$pass+$salt)

应该是

hash('sha512',$pass.$salt) // or
hash('sha512',"${pass}${salt}")

答案 1 :(得分:2)

这是PHP,$pass+$salt应为$pass . $salt

答案 2 :(得分:1)

我会对您当前的代码发表评论:

  1. 在两个字符串上使用+运算符(而不是.)会导致两个值的总和转换为整数(如果字符串不是数字,则会转换为{{1 }});当它传递给int(0)时,它会再次被转换为字符串,因此您的密码通常都是hash()。我不确定为什么你的盐都具有相同的值,除非你的数据库中的列数据类型是sha512("0")

  2. 您可以使用INT收集更多熵,从而获得更好的盐。

  3. 您应该使用专用密码哈希来哈希密码,例如crypt()中的BlowFish选项(确保您的列宽足够大);通过这种方式,您可以摆脱salt列,并且可以选择以向后兼容的方式验证哈希所需的工作量。

  4. Cookie列是否为我假设的自动登录功能?最好为此创建一个单独的表,其中包含随机字符串作为主键和users表的外键。这样您就可以支持从多个浏览器进行自动登录。

答案 3 :(得分:0)

错误

$pass+$salt

应该是

$pass.$salt

。用于php中的字符串连接