2013-12-09 63 views
-1

有幾個人一直告訴我,我的mysqli查詢中更新數據的代碼非常不安全。其實,這個網站上有好幾個人。所以我想知道他們說什麼會確保我的代碼在下面,所以更新我的數據庫時是安全的。我想知道如何確保我的mysqli查詢。用於更新MySQLI的代碼PHP

好吧,我爲我的數據庫條目的代碼,這是我做的。首先讓我說,我總是通過POST方法發送,以避免瀏覽器URL複雜化。

當我POST數據,這是我的代碼。

$ID = 1; 
$DATA = htmlentities(addslashes($_POST['data'])); 
$FIELD = "lifename"; 
$DBQUERY = "UPDATE `lifetable` SET `$FIELD` = '$DATA' WHERE `id` = $ID"; 
$DBRESULT = $MYSQLI->query($DBQUERY); 

我目前在我的本地網站上使用了此功能。

這是怎麼不安全的,如果我逃脫了所有的報價,所有的斜線,(通過Ajax從JavaScript)的所有&號和所有半冒號?這是如何扭轉的?

所以,你能告訴我到我的數據庫添加信息時,我應該改變。

感謝

PS ...我使用的mysqli,並會繼續使用它。由於

+0

嘗試爲數據庫查詢使用PDO語句。那麼你是在保存方面。 http://php.net/manual/en/intro.pdo.php – Jurik

+0

http://forums.mysql.com/read.php?52,227585,227585請閱讀這篇文章,你可能會因爲其良好的文摘數據庫的查詢,而不是供應商的特定功能mysql或者mysqli的 – gvgvgvijayan

+0

有一個辦法,以確保該mysqli的PDO使用後獲得不錯的主意,所以你甚至從來沒有接近我的回答問題,我的問題具體說mysqli。我在問如何讓我的mysqli語句更安全。 –

回答

1

數建議我從mysqli改爲pdo,但我不願意完全改變我如何從我的數據庫訪問數據。有人在發佈preparebind_param之前發佈了另一個鏈接,這就是我將要使用的。所以謝謝。

現在,這是我的代碼,並結合PARAMS應該讓這個各參數是隻爲我查詢的一個組成部分,不能爲別的,別的都沒有。

$DBQUERY = "UPDATE `lifetable` SET `lifename` = ? WHERE `id` = ?"; // EACH ? IS A PART OF bind_param BELOW IN ORDER AFTER TYPE. 

    $STMT = $MYSQLI->prepare($DBQUERY); 
    $STMT->bind_param('si', $DATA, $ID); // THIS MAKES SURE THAT THE VARIABLES ARE ONLY USED FOR THERE PLACE HERE AND NOTHING ELSE. ? in order. 

    $DATA = htmlentities($_POST['data']); // I STILL USE MY CODE HERE TO REMOVED ANY OTEHR CHARACTERS, JUST INCASE. AND BEFORE IT GETS HERE, IT USES encodeURIComponent TO OUTPUT FROM AJAX. 
    $ID = $COLUMN[1]; 

    $STMT->execute(); 
    $STMT->close(); 

我以前的代碼工作,現在它的工作,只是更安全,或者我被告知。

0

我覺得你的安全就在於SQL注入,而最好的方法,我知道,使查詢使用的VAR mysql_real_escape_string安全。這裏從php.net

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 
$city = $mysqli->real_escape_string($city); 
$mysqli->query("INSERT into myCity (Name) VALUES ('$city')") 

你可以使用同樣的方法帶到您的查詢的例子

$ID = 1; 
$DATA = $MYSQLI->real_escape_string($_POST['data'])); 
$FIELD = "lifename"; 
$DBQUERY = "UPDATE `lifetable` SET `$FIELD` = '$DATA' WHERE `id` = $ID"; 
$DBRESULT = $MYSQLI->query($DBQUERY); 

我編輯了以上的,因爲我忘記了lifename報價在我的問題。他們應該在那裏,因爲他們在我的原始代碼。

現在遊覽的查詢應該是安全的:d 這裏的參考php.net文檔: http://cn2.php.net/manual/en/mysqli.real-escape-string.php

+0

只要'lifename'不是一個常數,這段代碼會拋出一個錯誤。避免SQL注入的最好方法是使用PDO類。因爲它可以防止你所有的問題。 – Jurik

+1

真我只是複製上面的代碼不檢查輸入假設它已經工作XD – Aliceiw

+0

,爲什麼不? $ ID和$場是硬編碼的,所以我想是一類什麼的財產唯一明智的數據爲$ _ POST [「數據」]和mysql_real_escape_string提供安全性以防止SQL注入...... – Aliceiw

0

使用PDO類,如:

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD'); 
$query = $db->prepare('UPDATE `lifetable` SET :FIELD = :DATA WHERE `id` = :ID'); 
$query->execute(array(
    ':FIELD' => $field, 
    ':DATA' => $data, 
    ':ID' => $id 
)); 
$query->commit(); 

欲瞭解更多信息Are there good tutorials on how to use PDO?

+0

對不起,但我正在談論使用mysqli,正如我在標籤中所述。但是,謝謝 –

+0

這只是一個小例子,應該向你展示正確的方向。 – Jurik

+0

哦 - 我只是錯過了這個小小的'我' - 對不起。 – Jurik