sha('$ password')以空集返回

时间:2011-06-25 14:44:01

标签: php sha1 sha

我有两个问题。 问题一: 我正在尝试创建一个注册表单,用户可以在我的网站上注册。 当我运行这个mysql语句时,发现get dublicate条目错误:

$sql "insert into users(username, password) values('$username, sha('$password'))";

重复输入'da39a3ee5e6b4b0d3255bfef95601890afd80709'以获取密钥'密码' 尽管我多次更改了字符串sha('$ password')。 请帮忙。

else{
   include("databaseconnection.php");
   $databaseconnect = connect($host,$user,$password,$database)
      or die("couldnot connect to database serever.\n");
   $database_select = mysql_select_db($database,$databaseconnect)
      or die("could not select dabases.\n " .mysql_error());
   $query2 = "insert into company(username,password)
      values('$username',sha1('$password'))";
   $result2 = mysql_query($query2,$databaseconnect);
   echo "you have been registered as '$companyloginName' <br/>";
   header("Location:/index.php");

我的登录php脚本如下:

   $result ="select username, password form users where username ='$username' and password = sha('$password');
    if(mysql_num_rows($reuslt)==1){
   echo"welcome '$username";
    }

3 个答案:

答案 0 :(得分:1)

首先,我会强烈建议不要单独使用MySQL sha()或PHP sha1()进行密码哈希。 如果您的数据库遭到入侵,这对您的用户来说是一个巨大的安全风险。

请花时间到read my previous answer on the subject of password hashing以正确保护您的数据。


其次,您的代码容易受到SQL Injection attack的攻击。使用mysql_real_escape_string()来转义您之前要放入查询中的变量。

$query2 = "insert into company(username,password)
  values('" . mysql_real_escape_string($username) .
          "', sha1('" . mysql_real_escape_string($password) . "'))";

第三,您的$password变量被databaseconnection.php文件覆盖。

include("databaseconnection.php");
$databaseconnect = connect($host,$user, $password ,$database);

强调......

  

$databaseconnect = connect($host,$user, $password ,$database);

因此,查询中稍后使用的$password仍然包含数据库连接的密码,而不是用户的密码。

databaseconnection.php中更改变量的名称,甚至更好,使用数组来保存所有配置。

$dbConnectParams = array('host' => 'localhost'
                         'user' => 'myUser',
                         'pass' => 'myPassword',
                         'db' => 'myDB');

然后,按如下方式更改您的代码:

include("databaseconnection.php");
$databaseconnect = mysql_connect($dbConnectParams['host'],
                           $dbConnectParams['user'],
                           $dbConnectParams['pass'],
                           $dbConnectParams['db']);

由于您在调用mysql_connect()时已经传递了数据库,因此无需致电mysql_select_db()

答案 1 :(得分:0)

da39a3ee5e6b4b0d3255bfef95601890afd80709是空字符串的sha1哈希值。确保您实际将密码插入SQL查询中,例如通过回显查询而不是将其发送到SQL服务器。

修改将新信息添加到您的问题中,请查看以下两行:

include("databaseconnection.php");
$databaseconnect = connect($host,$user,$password,$database)

此处,$password用于连接数据库的密码。包含databaseconnection.php可能会覆盖之前$password变量中的内容。

尝试echo $query2,您可能会自己看到,SQL查询根本不包含任何密码,或者其中的密码与用户输入的密码不同。 / p>

答案 2 :(得分:0)

从注释行猜测,您可能会意外地使用“databaseconnection.php”中设置的连接密码而不是用户密码 - 您没有显示如何初始化$ password字符串。

还要注意你的sql中不应该出现的逗号:

insert into company(username,password,)
                                     ^

我没有测试过这是不是原因,但你应该把它除去并重新测试。

另外,认真考虑pdo / prepared语句以防止sql注入,如果你想从用户输入插入密码,更是如此。