2012-07-13 43 views
3

我終於做出了我認爲是一種很好,安全和快速的方式來執行查詢,但我希望在我將其全部實施到網站之前完全確定。MySQL/PHP - 這是一個好的和安全的方式逃脫querys?

我的代碼:

$email = $_POST['email']; 
$displayName = $_POST['displayName']; 
$pass = $_POST['pass1']; 

if($stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password) VALUES (?, ?, md5(?))")) { 

     /* Bind parameters 
      s - string, b - boolean, i - int, etc */ 
     $stmt -> bind_param("sss", $email, $displayName, $pass); 

     /* Execute it */ 
     $stmt -> execute(); 

     echo "You are now registered.<br />"; 
     echo "<a href=\"login.php\">Login</a>"; 


     /* Close statement */ 
     $stmt -> close(); 
    } 

順便說一句,這是什麼stmt是平均/代表什麼?

編輯,新建CODE:

/* Create a prepared statement */ 

    $stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password, 
    dateRegistered) VALUES (?, ?, md5(?), NOW())"); 

    if (false===$stmt) { 
     die('prepare() failed: ' . htmlspecialchars($link->error)); 
    } 

    $rc = $stmt -> bind_param("sss", $email, $displayName, $pass); 
    if (false===$rc) { 
     die('bind_param() failed: ' . htmlspecialchars($stmt->error)); 
    } 

    /* Execute it */ 
    $rc = $stmt->execute(); 
    if (false===$rc) { 
     die('execute() failed: ' . htmlspecialchars($stmt->error)); 
    } 

    echo "You are now registered.<br />"; 
    echo "<a href=\"login.php\">Login</a>"; 


    /* Close statement */ 
    $stmt -> close(); 
+1

stmt =語句 – 2012-07-13 22:37:32

+0

謝謝,應該想通了。 :P – 2012-07-13 22:38:35

+0

你不應該使用md5()作爲密碼,它不再安全。 (並且沒有使用鹽從未安全)。您應該*總是*在PHP端執行散列操作,否則密碼可能會在MySQL日誌文件中結束。 – Jacco 2012-07-16 09:54:06

回答

2

是 - 這是這幾乎避免了SQL注入,這是準備好的語句背後的主要目的的風險準備好的聲明。

唯一的缺點是,它們在用於需要使用不同查詢的工具的公用程序中時,可能會很麻煩,並且需要動態數量的字段。不過,您可以使用reflection to get round this

幾個三分球,雖然:

  • MD5口令?可能不是最安全的選擇。考慮使用加密鹽(如果你谷歌它很多的東西)

  • 你似乎正在採取數據直接從$_POST superglobal沒有檢查或sanisation,但我想這只是爲了保持長度的代碼這個SO問題的代碼片段。不要直接從輸入插入查詢 - 應該有驗證/轉義/編碼等階段。

  • 您似乎沒有檢查語句的執行是否成功 - 您認爲它是然後繼續反饋。首先檢查錯誤。

+0

他是不是仍然容易受到XSS攻擊? – 2012-07-13 22:46:37

+0

感謝您的回答! md5僅僅是現在,我將在稍後改進密碼安全性。我知道密碼是一件大事,但我會深入其中。當你說$ _POST的支票或衛生處理時,我想你的意思是,如果(isset($ _ POST ['email']))等等。關於聲明是否成功,我剛開始準備好聲明我不知道它的語法。你可以給我一個關於它的簡短信息的鏈接嗎? – 2012-07-13 22:47:31

+0

@保羅 - 我想我的第二個要點就是關於這一點,因爲數據的衛生和驗證將覆蓋這一點。爲了OP的好處,[這裏有更多的信息](http://stackoverflow.com/questions/568995/best-way-to-defend-against-mysql-injection-and-cross-site-scripting)。 – Utkanos 2012-07-13 22:50:08

相關問題