我已经构建了一个简单的注册表单,如下所示,我试图让用户加密他们的密码,然后输入我的数据库。我正在尝试使用md5加密。我还附加了数据库连接脚本。
我的目标是当我检查我的数据库时,我想看到以下内容:(id,name,username,encrypted password)
我遇到的问题是表单没有完全处理。我得到这个错误(错误:'字段列表'中的未知列'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>
答案 0 :(得分:6)
您在$enc_password
语句的列列表中使用了insert
。它应该是包含加密密码的列的名称。 不加密密码的值。如果加密密码列的名称为encrypted_password
,则将encrypted_password
放入列列表而不是$enc_password
INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `encrypted_password` , `confirm_password` )
始终清理用户输入。不要在查询中直接使用它们,这将允许攻击者注入任意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']);
加密密码的值不应为[$enc_password]
。不要用方形braket包围它。它应该是$enc_password
。
$sql="INSERT INTO `registernow_2012`.`users`
(`id` , `name` , `username` , `encrypted_password` , `confirm_password`)
VALUES
(NULL , '$name', '$username', '$enc_password', '$password')";
使用种子加密密码并使用其他散列(如sha1
)会更好$enc_password = sha1($password. "my_secret_seed");
答案 1 :(得分:4)
您收到错误的原因是(为了便于阅读而重新格式化代码):
$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 would have a field day。
关注the OWASP password storage rules和ese prepared statements and parameterized queries访问数据库。
答案 2 :(得分:3)
此行是您遇到问题的根源。
$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'])."')
";
答案 3 :(得分:2)
您正在使用双引号,并且您尝试插入与$enc_password
值同名的字段。当使用双引号时,PHP将评估所有变量的各自值。使用单引号,然后删除$符号。
另外:加密时: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')));
这将导致更安全的哈希值,可以轻松复制,而且在我看来,由于盐与密码混合在一起,使暴力攻击变得更加困难。
理想情况下,使用您编写的usort
函数,而不是自然 - 字母 - 排序......但每一点都有帮助。
我在这里编辑我的答案,因为这个问题似乎得到了很多点击,我觉得这是一个易于使用,并且很好的方式来限制用户信息。
答案 4 :(得分:0)
您的查询不正确。
尝试以下查询插入
$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 [“password”]);
祝你好运!
答案 5 :(得分:-1)
"INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `password`, `confirm_password`)
VALUES (NULL , '$_POST[name]', '$_POST[username]', '$enc_password', '$_POST[confirm_password]')";
假设数据库中的字段为“password”,则表示您将密码的字段名称设置为编码密码。
HOWEVER ,你需要防止MySQL注入,不要只是将帖子中的数据放入数据库。