2012-12-07 61 views
2

我剛剛寫完我自己的PHP註冊腳本,因爲我是新手,我想問一下我使用的方法是否可以安全地從sql注入?這種存儲方法SQL注入「安全」?

這是我與我的SQL數據庫進行數據交換的例子:

public function StoreUser($name, $email, $password, $devid) { 

    $mysqli = new mysqli("host", "user", "pass", "data"); 
    if ($mysqli->connect_errno) { 
     echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
    } 

    $unique_id = uniqid('', true); 
    $hash = $this->hashSSHA($password); 

    $add_user = $mysqli->prepare("INSERT INTO `users` SET `unique_id`=?, `name`=?, `email`=?, `encrypted_password`=?, `salt`=?, `devid`=?, `created_at`=?"); 
    $add_user->bind_param("sssssss",$unique_id,$name,$email,$hash["encrypted"],$hash["salt"],$devid,date("H:i:s")); 
    if ($add_user->execute()) { 
     $add_user->close(); 
     $mysqli->close(); 
     return true; 
    } 
    else { 
     $add_user->close(); 
     $mysqli->close(); 
     return false; 
    } 

} 

回答

2

使用proper SQL placeholders是實現應用程序安全性的重要第一步。在這種情況下,您不必擔心任何SQL注入漏洞,如果您嚴格遵守的任何全部用戶提供的數據,但可能存在其他問題。

請記住,就像你爲SQL語句轉義事物一樣,你也應該努力在用戶提供的數據以HTML格式顯示之前逃避,否則最終會出現各種問題,最糟糕的是XSS

在任何情況下,PDO使轉義變得容易很多。 mysqli通常僅在PDO不可用的情況下使用。

沒有奇異的魔力子彈,但有很多事情可以做,以防止您的應用程序被濫用,或者只是遭受令人尷尬的錯誤。不過,如果你正在編寫自己的底層數據庫接口代碼,而不是使用框架,這可能很難做到。你會花很多時間重新發明車輪。

+0

感謝您的提示!我會研究這一點。 問題是,我還沒有找到適合我的項目的框架。我需要一個數據庫來創建一個android應用程序的用戶列表。我還沒有找到任何令人滿意的框架。 – Lotzki

+0

更受歡迎的PHP選擇是[CakePHP](http://cakephp.org/),[CodeIgnighter](http://codeignighter.com/)或[FuelPHP](http://fuelphp.com),所有這些選項明顯好於從頭開始。這些並不是太棘手的問題,但是你必須按照框架期望的方式來處理,按照慣例,或者他們可能會覺得困難。儘管這些慣例通常有一個原因,並且當你更好地理解哲學時,你所做的很多事情變得更容易實現。你應該實現你的業務邏輯,而不是樣板。 – tadman

+0

一旦你選擇了一個框架,你也可以訪問各種[預製的東西](http://plugins.cakephp.org/)。獨自行走就像試圖在荒野中徒步旅行。它可以是教育性的,但是如果你的目標是要到達某個地方而不是探索,那麼如果有一個目標去你想要的地方,那麼你應該使用一條道路。 – tadman

5

是的,它是安全的。

您正在使用參數化查詢,它從根本上將數據從命令中分離出來,使您免受一階SQL注入攻擊的威脅。