PHP MD5密码加密和数据库输入


PHP MD5 Password Encryption and DB Entry

我已经构建了一个简单的注册表,如下所示,我正在尝试让用户对他们的密码进行加密,然后输入到我的数据库中。我正在尝试使用md5加密。我还附上了数据库连接脚本。

我的目标是当我检查我的数据库时,我想看到以下内容:(id,名称,用户名,加密密码)

我遇到的问题是表单没有完全处理。我得到的都是这个错误(错误:"字段列表"中的未知列"d8578edf8458ce06fbc5bb76a58c5ca4")。

有人能告诉我或向我展示"在我的代码或SQL插入和/或变量中需要更正什么"以使其正确工作吗。我知道这可能是一个非常非常简单的解决方案。我只是被困在这一点上。

我真的很感激你的帮助。

<?php
error_reporting(0);
if($_POST['submit'])
{ //Begining of full IF Statment
$name = $_POST['name'];
$username = $_POST['username'];
$password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];
// Encrypt Pasword
$enc_password = md5($password);
//$enc_password2 = md5($confirm_password);

// Confirm All feild were filled out when submit button was pressed
if($name && $username && $password && $confirm_password) 
{
// Confirm that the NAME that you used is NOT greater than 30 characters     
     if(strlen($name)>24)
     {
     echo "<h2><center>YOUR NAME IS TOO LONG!!!!</center></h2><br>";
     }
// Confirm that the USERNAME that you used is NOT greater than 10 characters        
    if(strlen($username)>10)
     {
     echo "<h2><center>YOUR USERNAME IS TOO LONG!!!!</center></h2><br>";
     }
     else {
// Confirm that the PASSWORD that you used MATCH & Between 6 and 15 characters   
        if(strlen($password)>10 || strlen($password)<6)
         {
         echo "<h2><center>YOUR PASSWORD MUST BE BETWEEN 6 and 15          CHARACTERS!!!!</center></h2><br>";
         }
        if($password == $confirm_password)
        {
        // Database Connection required
        require "db_conncect.php";
        // We Now connect to the Dabase and insert the Form input details
        //------- ### ENTERING ALL INFORMATION INTO THE DATABASE BELOW ### --------// 

// 1. Create a database connection
$con = mysql_connect("localhost","root",""); // <-- THIS IS WHERE YOU " CAN CHANGE " THE USERNAME IS "root", PASSWORD IS "" ONLY.
if (!$con) {
  die('Database connection failed could not connect: ' . mysql_error());
  }
// 2. Select a database to use
$db_select = mysql_select_db("registernow_2012",$con); // <-- THE "registernow_2012" IS     THE NAME OF THE DATABASE.
if (!$db_select) {
  die('Database selection failed could not connect: ' . mysql_error());
}
mysql_select_db("registernow_2012", $con); // <-- THE "registernow_2012" IS THE NAME OF THE DATABASE TO BE CONNECTED.
    // <-- THE `registernow_2012` IS THE NAME OF THE DATABASE TO BE CONNECTED....     `visitors` IS THE TABLE WITH ALL THE FIELDS WITHI IN THE DATABASE.

$sql="INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` ,
`$enc_password` , `confirm_password`    )
VALUES (NULL , '$_POST[name]', '$_POST[username]', '[$enc_password]', '$_POST[confirm_password]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
}
// 3. Close Connection
mysql_close($con);
header("Location: index.php");  // <-- THIS IS WHERE YOU CAN CHANGE THE "Location: Thank you / Index page" of the THANK YOU PAGE.       
        }
    else 
    {
    echo "<h2><center>PASSWORDS MUST MATCH!!!!!</center></h2><br>";
    }   
     }
    //echo "<h2><center>WORKING!!!!</center></h2>";
}   
else echo "<h2><center>ALL FEILDS MUST BE COMPLETED</center></h2>";
} //Ending of full IF Statment
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <title>THE FORM MY WAY NOW</title>
    </head>
<body>
<div id='centerstage'>
    <form name="myform" action="workingitoutproperly.php" method="POST">
      <p>
        <label>Name</label><br>
        <input type='text' name='name' value=''><br>
        <label>UserName</label><br>
        <input type='text' name='username' value=''><br>
        <label>Password</label><br>
        <input type='password' name='password' value=''><br>
        <label>Re-Enter Password</label><br>
        <input type='password' name='confirm_password' value=''><br>
        <br>
        <input type='submit' name='submit' value='REGISTER NOW!!'>
    </p>
</form>
</div>
</body>

  1. 您已经在insert语句的列列表中使用了$enc_password它应该是保存加密密码的列的名称不是加密密码的值。如果加密密码列的名称是encrypted_password,则将encrypted_password放在列列表中,而不是$enc_password

    INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `encrypted_password` , `confirm_password` )
    
  2. 始终对用户输入进行消毒。不要在查询中直接使用它们,这将允许攻击者注入任意SQL。mysql数据库至少使用mysql_real_escape_string

    $name = mysql_real_escape_string($_POST['name']);
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    
  3. 加密密码的值不应该是CCD_ 7。不要用方形制动器把它围起来。应该是$enc_password

    $sql="INSERT INTO `registernow_2012`.`users` 
    (`id` , `name` , `username` , `encrypted_password` , `confirm_password`) 
    VALUES
    (NULL , '$name', '$username', '$enc_password', '$password')";
    
  4. 最好用种子加密密码,并使用其他哈希,如sha1

    $enc_password = sha1($password. "my_secret_seed");
    

您收到错误是因为您有(为可读性重新格式化的代码):

$sql = "INSERT INTO `registernow_2012`.`users` " .
       "(`id` , `name` , `username` , `$enc_password` , `confirm_password`    ) " .

您正在使用编码密码作为列名

       "VALUES (NULL , '$_POST[name]', '$_POST[username]', '[$enc_password]', '$_POST[confirm_password]')";

您将把编码后的密码包装在变量的方括号中。

但是,此代码存在大量安全问题

MD5不再安全,Bobby会玩得很开心。

遵循OWASP密码存储规则以及ese准备的语句和参数化查询来访问数据库。

这一行是问题的根源。

 $sql="INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `$enc_password` , `confirm_password`    ) VALUES (NULL , '$_POST[name]', '$_POST[username]', '[$enc_password]', '$_POST[confirm_password]')";

让我们来分解一下:

首先,我们需要从字段名中删除一个杂散$

INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `$enc_password` , `confirm_password`
//                                                                   ^^^ Remove me!

接下来,我们需要逃避我们的输入(除非你想访问Bobby Tables):

NULL , '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['username'])."', '$enc_password', '".mysql_real_escape_string($_POST['confirm_password'])."')

所以最后一行看起来是这样的:

$sql = "
  INSERT INTO `registernow_2012`.`users`
    (`id` , `name` , `username` , `enc_password` , `confirm_password`)
  VALUES
    (NULL , '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['username'])."', '$enc_password', '".mysql_real_escape_string($_POST['confirm_password'])."')
";

您正在使用双引号,并试图插入与$enc_password值同名的字段。当使用双引号时,PHP将根据所有变量各自的值对其进行求值。使用单引号,并删除$sign.

另外:加密时:sha1更安全,而且不只是加密密码,添加一些盐:

$end_password = sha1('F00_'.$_POST['password'].'_8aR-this-is-5Alt');

编辑:也许一个更好的方法来优化你的密码是这样的:

$superSalty = sort(array_merge(str_split($pass), str_split('F00_8aR-th1s-1s-5Alt')));

这将产生一个更安全的散列,可以很容易地复制,在我看来,考虑到salt与密码的混合,这将使暴力攻击变得更加困难。

理想情况下,使用您编写的usort函数,而不是自然的字母排序。。。但每一点都有帮助。我在这里编辑我的答案,因为这个问题似乎得到了很多点击,我觉得这是一个易于使用的好方法,可以很好地增加用户信息。

您的查询不正确。

尝试以下插入的查询

$sql="INSERT INTO `registernow_2012`.`users` 
(name , username , enc_password, confirm_password )
VALUES 
( '".mysql_real_escape_string($_POST[name])."', '".mysql_real_escape_string$_POST[username])."', '".$enc_password."', '".mysql_real_escape_string($_POST[confirm_password])."')
";

这里我假设您的变量$enc_password是加密密码。像

$enc_password=md5($_POST["密码"]);

祝你好运!

"INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `password`, `confirm_password`) 
VALUES (NULL , '$_POST[name]', '$_POST[username]', '$enc_password', '$_POST[confirm_password]')";

假设数据库中的字段是"password",则将密码的字段名设置为编码密码。

但是,您需要防止MySQL注入,而不仅仅是将post中的数据放入数据库。

请参阅SQL注入