2012-10-06 25 views
0

我一直在環顧四周,無法找到一個地方向我展示了一種有效的方法。目前我有一個查詢,當用戶提交表單時運行:使用登錄用戶和SHA1密碼更新多個文件夾

$query = "UPDATE user SET username='$_POST[username]', 
nicename='$_POST[nicename]', 
email='$_POST[email]', 
password=(SHA1)'$_POST[password]', 
position='$_POST[position]', 
race='$_POST[race]', 
type='$_POST[type]' WHERE username=$_SESSION[admin_login]"; 

我不知道如何讓這個實際上正常工作。對不起,如果它之前被問過,但我無法在任何地方找到一個好的解決方案。預先感謝您的幫助。

+0

你到底想達到什麼目的? – janenz00

+0

用戶有一張表格可以填寫所有信息的位置。提交後,它應該更新他們的所有個人資料信息。 –

+1

**你的代碼容易受到SQL注入**你真的*應該使用[prepared statements](http://stackoverflow.com/a/60496/623041),將你的變量作爲參數傳遞給你沒有得到評估的SQL。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。 – eggyal

回答

2

首先整件事情是錯的:爲什麼?

因爲首先你需要淨化輸入,你沒有做的,至少你應該使用mysqli_real_escape_string這樣的:

$nicename = mysqli_real_escape_string($connect, $_POST['nicename']); 

Reference

其次,你應該在你面前加密密碼在您的查詢中使用它,例如將您的加密密碼分配給一個變量,然後在查詢中使用它,如下所示:

$hashed_pass = sha1($_POST['password']); 

//Query goes here 

和最後但並非最不重要的,而不是直接在查詢中使用super global $_SESSION variable,使用串連它..這樣

WHERE username='".$_SESSION[admin_login]."'"; 
+0

澄清 - 你可以使用'WHERE用戶名= $ _ SESSION [admin_login]',但它不被認爲是乾淨的代碼,因爲你應該引用你的聯合索引$ _SESSION ['admin_login'] vs $ _SESSION [admin_login]。另外,它使查詢對SQL注入攻擊開放。 –

+0

如果需要的話,也可以使用MySQL的['SHA1()'](http://dev.mysql.com/doc/en/encryption-functions.html#function_sha1)函數。 – eggyal

+0

@ GeekNum88和eggyal感謝您的信息,我編輯:)學到了一些新的東西,實際上如果我不使用連接超級全局變量PHP顯示我的錯誤.. –

1

首先,永遠記住Little Bobby Tables。像這樣插入數據可能會導致SQL注入攻擊,就像那個卡通片一樣。我強烈建議您使用準備好的語句,這是PDO和MySQLi中的一項功能,它們是使用PHP讀取和寫入數據庫的方法,有些信息如下:PDO以及一些信息:MySQLi

無論你選擇與哪一個並不重要,它更多的是關於個人偏好。我喜歡PDO,所以這裏的結合數據,然後執行使用PDO您的查詢的例子:

$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

$password = sha1($_POST[password]); 

$stmt = $dbh->prepare("UPDATE user SET username = :username, nicename = :nicename, email = :email, password = :password, position = :position, race = :race, type = :type WHERE = :username"); 
$stmt->bindParam(':username', $_POST['username']); 
$stmt->bindParam(':nicename', $_POST['nicename']); 
$stmt->bindParam(':email', $_POST['email']); 
$stmt->bindParam(':password', $password); 
$stmt->bindParam(':position', $_POST['position']); 
$stmt->bindParam(':race', $_POST['race']); 
$stmt->bindParam(':type', $_POST['type']); 
$stmt->bindParam(':username', $_SESSION['admin_login']); 

$stmt->execute(); 
1

$_POST$_GET陣列可以包含危險的數據,所以你需要將它們插入到數據庫之前準備從這些陣列的數據。

首先,您需要對正確的數據類型進行類型轉換。在PHP中,可以使用以下結構:字符串數據爲(string),數字數據爲(int)(float),布爾數據爲(bool)

字段email需要檢查有效的電子郵件,使用正則表達式。

跟蹤代碼檢查數據的樣本:

<?php 
    $link  = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); 

    $username = mysqli_real_escape_string($link, (string) $_POST['username']); 
    $nicename = mysqli_real_escape_string($link, (string) $_POST['nicename']); 
    $email = mysqli_real_escape_string($link, (string) $_POST['email']); 
    $email = preg_replace('/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/', $email); 
    $password = sha1((string) $_POST['password']); 
    $position = mysqli_real_escape_string($link, (string) $_POST['position']); 
    $race  = mysqli_real_escape_string($link, (string) $_POST['race']); 
    $type  = mysqli_real_escape_string($link, (string) $_POST['type']); 
    $admin = $_SESSION['admin_login']; 

    $query = "UPDATE `user` 
       SET `username`='$username', 
        `nicename`='$nicename', 
        `email`='$email', 
        `password`='$password', 
        `position`='$position', 
        `race`='$race', 
        `type`='$type' 
       WHERE `username`='$admin'"; 

    mysqli_query($link, $query); 
    mysqli_close($link); 
+0

因此,脫離mysqli轉義字符串,它看起來像它需要兩​​個參數。一個是字符串和一個連接信息。我使用'code' $ username = mysqli_real_escape_string((string,$ con)$ _POST ['username']);'code'這是一個語法錯誤,不會運行;任何想法都是偶然的? :( –

+0

哦,我的錯,我糾正了我的答案, – doktorgradus

+0

太棒了。:)我有點理解它,但這需要一些習慣。我很感激幫助。 :) –

相關問題