2012-03-21 2 views
1

Я создал простую регистрационную форму, показанную ниже, и Iam, пытаясь заставить пользователей зашифровать свои пароли, а затем войти в мою базу данных. Я пытаюсь использовать шифрование md5. Я также подключил сценарий подключения к базе данных.PHP 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> 

+4

Инъекция Google SQL перед взломом вашего сайта, пожалуйста. Кроме того, MD5 не шифрует. – ceejayoz

+1

Ваша проблема в том, что в вашем полевом списке есть '$ enc_password' ... Я уверен, что вы имеете в виду' enc_password' ... – keithhatfield

+0

@ceejayoz спасибо, сэр, я очень ценю ваше предложение –

ответ

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'])."') 
"; 
-1
"INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `password`, `confirm_password`) 
VALUES (NULL , '$_POST[name]', '$_POST[username]', '$enc_password', '$_POST[confirm_password]')"; 

Предполагая, что поле является «пароль» в базе данных, вы настраивали имя поля для пароля в качестве закодированного пароля.

HOWEVER, вам нужно предотвратить использование MySQL, не просто помещать данные из сообщения в базу данных.

См SQL Injection

+2

Не используйте этот код. Он ** широко открыт ** для SQL-инъекции. – Brad

+0

Будет обновлено, чтобы отразить это. Просто пытался показать, что он использовал закодированный пароль в качестве имени поля, а не «пароль». –

6
  1. Вы использовали $enc_password в списке столбцов в insert заявлении. Это должно быть имя столбца, в котором хранится зашифрованный пароль. Не значение шифруется password.If имя зашифрованного столбца паролей является encrypted_password поместить encrypted_password в списке столбцов вместо $enc_password

    INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `encrypted_password` , `confirm_password`) 
    
  2. Всегда дезинфицировать ввода пользователя. Не используйте их непосредственно в запросе, который позволит злоумышленнику вводить произвольный SQL. По крайней мере, используйте mysql_real_escape_string для базы данных mysql.

    $name = mysql_real_escape_string($_POST['name']); 
    $username = mysql_real_escape_string($_POST['username']); 
    $password = mysql_real_escape_string($_POST['password']); 
    
  3. значение зашифрованного пароля не должно быть [$enc_password]. Не закрывайте его квадратной скобой. Он должен быть $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"); 
    
+0

Ваш код ** также широко открыт ** для SQL-инъекции. Пожалуйста, не отправляйте ответы, подобные этому в «Переполнение стека». Кто-то может попытаться использовать ваш код. – Brad

+0

Даун-избиратель, объясните причину. –

+0

Я уже сделал. Является ли уязвимость SQL-инъекций недостаточно обоснованной? Я думаю, что это. – Brad

2

Вы используете двойные кавычки, и вы пытаетесь вставить в поле который имеет то же имя, что и значение $enc_password. PHP будет оценивать все переменные до их соответствующих значений при использовании двойных кавычек. Используйте одинарные кавычки и удалите знак $.

также: при шифровании: sha1 безопаснее, и не только зашифровать пароль, добавить немного соли:

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

Edit: Возможно, еще лучше, чтобы соль ваши пароли будет таким:

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

это приведет к еще более безопасный хэш, который легко может быть воспроизведен и, на мой взгляд, делает грубую силу еще более трудным, учитывая тот факт, соль смешивает с паролем.

В идеале используйте функцию usort, которую вы написали, а не естественную -арифметическую сортировку ... но каждый бит помогает. Я редактирую свой ответ здесь, потому что этот вопрос, кажется, получает много хитов, и я чувствую, что это простой в использовании и хороший способ солить информацию о пользователе.

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 для доступа к базе данных.

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"]);

Удачи!

+1

Не используйте этот код. Он ** широко открыт ** для SQL-инъекции. Сколько раз мне нужно публиковать это здесь? – Brad

+0

Показывал правильный запрос для решения проблемы запуска пользовательского запроса. обновлено сейчас, спасибо. – fmask

+0

Хеши не шифруются. Кроме того, вы не должны использовать MD5 для хэшей паролей. Попробуйте джакузи или что-то в этом роде. – Brad

Смежные вопросы