【问题标题】:sha('$password') return with empty setsha('$password') 返回空集
【发布时间】:2011-09-22 15:15:08
【问题描述】:

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

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

【问题讨论】:

  • 为什么对密码字段有唯一约束?多个用户不能有相同的密码吗?
  • 谢谢你的提问......我实际上删除了密码字段上的唯一约束,但发生的是不同密码的用户可以登录彼此的帐户,因为 sha('$password')和 sha('$password1') 具有相同的 'da39a3ee5e6b4b0d3255bfef95601890afd80709'。
  • 补充@Emil所说的,确保允许人们使用相同的密码,或者至少不要显示消息以防他们输入已经存在的密码,因为它会提供很好的安全性应用中的漏洞
  • 1. $databaseconnect 被注释掉。 2. 您的$sql 变量中缺少= 和结束引号。
  • 为了安全起见,请不要这样散列您的密码Read this answer on how to securely hash passwords

标签: php sha1 sha


【解决方案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()

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢emil,但是我可以看到用户名实际上是插入到数据库中的,密码列中插入了字符串'da39a3ee5e6b4b0d3255bfef95601890afd80709'。表格 users 的所有其他列均已正确填充。
    • 这里是 php 代码:else{ include("databaseconnection.php"); /*$databaseconnect = connect($host,$user,$password,$database) or die("无法连接到数据库服务器。\n");*/ $database_select = mysql_select_db($database,$databaseconnect) or die( "无法选择数据库。\n " .mysql_error()); $query2 = "插入公司(用户名,密码,) 值('$username',sha1('$password'))"; $result2 = mysql_query($query2,$databaseconnect); echo "您已注册为 '$companyloginName'
      "; header("位置:/index.php");
    • @sareeye,请更新问题以反映这一点,然后我们可以回答。
    • 嗨@inca,我确实更新了问题。我真的没有看到我的php代码有任何问题,我不明白为什么没有填充密码列?任何帮助将不胜感激。
    【解决方案3】:

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

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

    insert into company(username,password,)
                                         ^
    

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

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

    【讨论】:

    • 非常感谢。你是对的,我不小心使用了连接密码。再次干得好
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2015-07-04
    • 1970-01-01
    • 2020-01-19
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多