2012-03-21 19 views
1

以下に示す簡単な登録フォームを作成しました。ユーザーにパスワードを暗号化してからデータベースに入力させようとしています。私はmd5暗号化を使用しようとしています。データベース接続スクリプトも添付しました。PHP MD5パスワードの暗号化とDBエントリ

私が持っている問題は、フォームが完全に処理されないということです(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]')"; 

あなたがエンコードされたパスワードとしてパスワードのフィールド名を設定して、データベース内の「パスワード」です。

もつとも、あなただけのデータベースにポストからのデータを入れないで、MySQLの注入に対する予防する必要があります。

はあなたがinsert文の列リストに$enc_passwordを使用していたSQL Injection

+2

このコードは使用しないでください。 ** SQLインジェクションには**広く開かれています**。 – Brad

+0

これを反映するように更新されます。 「パスワード」ではなく、フィールド名としてエンコードされたパスワードを使用していたことを示しています。 –

6
  1. を参照してください。これは、暗号化されたパスワードを保持する列の名前である必要があります。暗号化されたパスワード列の名前password.If暗号化のない値は、常にユーザー入力をサニタイズ代わり$enc_password

    INSERT INTO `registernow_2012`.`users` (`id` , `name` , `username` , `encrypted_password` , `confirm_password`) 
    
  2. の列リストにencrypted_passwordencrypted_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']); 
    
  3. 暗号化されたパスワードの値は[$enc_password]すべきではありません。それを正方形のブラケットで囲まないでください。それは$enc_passwordでなければなりません。より良いあなたがシードとパスワードを暗号化し、あなたが二重引用符を使用している、とあなたがフィールドに挿入しようとしているSHA1

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

あなたのコードはSQLインジェクションにも**広く開かれています**。このような回答はStack Overflowに投稿しないでください。コードを使用しようとする可能性があります。 – Brad

+0

ダウン投票者、あなたの理由を説明してください。 –

+0

私はすでにやりました。 SQLインジェクションの脆弱性が十分な理由ではないそれはそうですね。 – Brad

2

のような他のハッシュを使用し

$sql="INSERT INTO `registernow_2012`.`users` 
(`id` , `name` , `username` , `encrypted_password` , `confirm_password`) 
VALUES 
(NULL , '$name', '$username', '$enc_password', '$password')"; 
  • その$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

    あなたは(読みやすいように再フォーマットコード)持っているので、あなたがエラーを取得している:あなたは

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

    列名としてエンコードされたパスワードを使用していて、ラップしている

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

    を変数の大括弧で囲んだコード化されたパスワード。

    しかし、このコードは大規模なセキュリティ問題をています。

    MD5はもはや安全でなく、Bobby would have a field dayです。

    は、データベースにアクセスするためにthe OWASP password storage rulesese 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がパスワードを暗号化されていると仮定しています。 like

    $ enc_password = md5($ _ POST ["password"]);

    Good Luck!

    +1

    このコードは使用しないでください。 ** SQLインジェクションには**広く開かれています**。何回ここに投稿しなければならないのですか? – Brad

    +0

    ユーザークエリ実行問題を解決するための正しいクエリを表示していました。今更新されました。 – fmask

    +0

    ハッシュは暗号化されていません。また、パスワードハッシュにはMD5を使用しないでください。ジェットバスや何かを試してみてください。 – Brad

    関連する問題