2013-10-10 34 views
-3

即時通訊編程和PHP新,我想在我的註冊系統上創建一個錯誤,當用戶創建一個帳戶與數據庫中已存在的相同的用戶名時它說的是這樣的:「用戶名已被使用」,然後,如果它不是現有的用戶名它說:‘Registation完成’mysql - 想要創建錯誤

我試過這段代碼:

<? 
require ("conect.php"); 

$user = $_POST['user']; 

$pass = $_POST['password']; 

$email = $_POST['email']; 

$email_check = $_POST['email_check']; 


$register = mysql_fetch_array; 




if($user = $register[user]) { 
echo"Username already in use"; 
} 
else 
{ 

$insert = mysql_query("INSERT INTO registration (user, password, email) 
     VALUES('$_POST[user]','$_POST[password]','$_POST[email]')"); 

    echo "The account $user was successfully created."; 

} 

?> 

但它沒有工作,能有人幫助,請

+0

'$寄存器= mysql_fetch_array; 「你覺得這個怎麼樣? – 2013-10-10 21:45:35

+1

可愛的[SQL注入攻擊漏洞](http://bobby-tables.com)。享受你的服務器+網站pwn3d。 –

+0

您需要查找關於如何選擇數據的PHP教程。你有正確的想法,但錯誤的語法在這裏 - 你想從你的表中選擇少量的數據,其中用戶名=發佈用戶名,如果它返回,它存在,如果沒有,插入(插入查詢很好,但這是一個主要的安全風險 - 你需要像'mysqli_real_escape_string'或'htmlentities'等那樣來轉義所發佈的變量) –

回答

1

你真的,真的需要閱讀約prepared statements。您使用的方法非常陳舊,難以置信地不安全,而且通常是按照今天的標準來看是一種糟糕的做法。

因爲這些原因,你的代碼甚至不值得修復,所以應該用準備好的語句重新編寫代碼。

+0

以及即時通訊不試圖創建一個安全的網站,事實上,我正在使用免費的主機,即時通訊做關於PHP的測試。但是,無論如何感謝您的幫助,我會檢查該鏈接 – Tiago

3
  1. 正如指出的其他用戶,你應該通過PDO使用準備好的語句(或mysqli的,但我絕對喜歡PDO)

  2. 你存儲變量的帖子,但隨後在數據庫查詢你只是再次使用$ _POST變量?

  3. 我不確定你在做什麼$register = mysql_fetch_array部分,但要獲得所需的功能,您應該使用select查詢來計算使用用戶名的用戶數量。

  4. 您沒有使用任何安全散列格式來存儲密碼。我將它切換爲使用password_hash()。

嘗試是這樣的(我還沒有測試的代碼,但雖然如此,有可能是錯誤的):

<?php 

    //Put all POSTS in variables 
    $user     = $_POST['user']; 
    $pass     = password_hash($_POST['password'], PASSWORD_DEFAULT); 
    $email    = $_POST['email']; 
    $email_check   = $_POST['email_check']; 

    //Database config- probably should store in a separate file 
    $database_host  = ""; 
    $database_name  = ""; 
    $database_user  = ""; 
    $database_password = ""; 

    $conn = new PDO("mysql:host=$database_host;dbname=$database_name",$database_user,$database_password); 

    //Find out if the username is taken. 
    $sql = "SELECT count(*) FROM `registration` WHERE user = :user"; 
    $q = $conn->prepare($sql); 
    $q->execute(array(':user' => $user)); 
    $number_of_rows = $q->fetchColumn(); 

    //Clear $sql and $q so you can use them again 
    $sql = NULL; 
    $q = NULL; 

    if ($number_of_rows > 1) { 

     //Username already taken 
     echo "Username already taken"; 

    } 
    else { 

     $sql = "INSERT INTO registration (user,password,email) VALUES (:user,:password,:email)"; 
     $q = $conn->prepare($sql); 
     $q->execute(array(':user'=>$user, ':password'=>$password, ':email'=>$email)); 

     echo "The account " . $user . " was successfully created"; 

    } 
?> 
+1

'password_hash()'只在PHP 5.5中出現,而在很多託管服務器上尚未提供。 – 2013-10-10 23:10:50