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


sha('$password') return with empty set

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

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

密钥"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";
    }

首先,我建议不要将MySQL的sha()或PHP的sha1()单独用于密码哈希目的如果您的数据库遭到破坏,这对您的用户来说是一个巨大的安全风险

请花点时间阅读我之前关于密码哈希的回答,以正确保护您的数据。


其次,您的代码容易受到SQL注入攻击。使用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()

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

编辑随着新信息添加到您的问题中,请检查以下两行:

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

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

尝试echo $query2,您可能会亲眼看到,SQL查询根本不包括任何密码,或者其中的密码与用户输入的密码不同。

根据注释行推测,您可能意外使用了在"databaseconnection.php"中设置的连接密码,而不是用户密码-您没有显示如何初始化$password字符串。

还要注意sql中不应该存在的逗号:

insert into company(username,password,)
                                     ^

我还没有测试这是否是原因,但你可能应该把它去掉,再测试一次。

此外,请认真考虑pdo/prepared语句以防止sql注入,如果您想从用户输入中插入密码,则更应如此。