1

我有两个问题。问题一:我正在尝试创建一个注册表单,用户可以在其中注册我的网站。当我运行这个 mysql 语句时,出现一个 get duplicate entry found 错误:

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

尽管我多次更改了字符串 sha('$password') ,但密钥“密码”的重复条目“da39a3ee5e6b4b0d3255bfef95601890afd80709”。请帮忙。

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";
    }
4

3 回答 3

1

首先,我强烈建议不要将 MySQLsha()或 PHPsha1()单独用于密码散列目的。如果您的数据库受到威胁,这对您的用户来说是一个巨大的安全风险。

请花时间阅读我之前关于密码散列主题的回答,以正确保护您的数据。


其次,您的代码容易受到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()

于 2011-06-25T20:23:17.273 回答
0

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

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

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

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

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

于 2011-06-25T15:20:27.293 回答
0

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

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

insert into company(username,password,)
                                     ^

我没有测试这是否是原因,但你可能应该摆脱它并再次测试它。

此外,认真考虑 pdo /prepared statements 以防止 sql-injections,如果您想从用户输入中插入密码,则更是如此。

于 2011-06-25T16:43:05.547 回答