2013-08-19 63 views
0

正如書名所描述的,我遇到了一個SQL注入錯誤:錯誤嘗試更新PHP/MySQL的代碼更改爲新密碼

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1

我該如何解決這個問題?以下提供的是我的PHP代碼和HTML代碼

PHP:

if($_POST['submit']=='Change') 
{ 
    $err = array(); 
    if(!$_POST['password1'] || !$_POST['passwordnew1']) 
     $err[] = 'All the fields must be filled in!'; 
    if(!count($err)) 
    { 
     $_POST['password1'] = mysql_real_escape_string($_POST['password1']); 
     $_POST['passwordnew1'] = mysql_real_escape_string($_POST['passwordnew1']); 
     $row = mysql_fetch_assoc(mysql_query("SELECT id,username FROM members WHERE username='{$_SESSION['username']}' AND pass='".md5($_POST['password1'])."'")); 
     if($row['username']) 
     { 
      $querynewpass = mysql_query("UPDATE members SET pass='".md5($_POST['passwordnew1'])."' WHERE username='{$_SESSION['username']}'"); 
      $result = mysql_query($querynewpass) or die(mysql_error()); 
     } 
     else $err[]='Wrong Password To Start With!'; 
    } 
    if($err) 
    $_SESSION['msg']['passwordchange-err'] = implode('<br />',$err); 
    header("Location: members.php?id=" . $_SESSION['username']); 
    exit; 
} 

HTML:

<form action="" method="post">  
<?php 
     if($_SESSION['msg']['passwordchange-err']) 
     { 
     echo '<div class="err">'.$_SESSION['msg']['passwordchange-err'].'</div>'; 
     unset($_SESSION['msg']['passwordchange-err']); 
     } 
     if($_SESSION['msg']['passwordchange-success']) 
     { 
     echo '<div class="success">'.$_SESSION['msg']['passwordchange-success'].'</div>'; 
     unset($_SESSION['msg']['passwordchange-success']); 
     } 
?> 
    <label class="grey" for="password1">Current Password:</label> 
    <input class="field" type="password" name="password1" id="password1" value="" size="23" /> 
    <label class="grey" for="password">New Password:</label> 
    <input class="field" type="password" name="passwordnew1" id="passwordnew1" size="23" /> 
    <input type="submit" name="submit" value="Change" class="bt_register" style="margin-left: 382px;" /> 
</form> 

我有工作,其中用戶能夠改變/更新其密碼,但是當,他們點擊表單上的更改按鈕,將它們定向到我在上面發佈的錯誤消息,並且如果他們單擊刷新按鈕,只有它們被重定向回到其配置文件並且已做出更改。所以我的主要問題在於,如何在沒有mysql錯誤消息的情況下完全工作?任何幫助將非常感激!

+1

''{$ _SESSION ['username']}''我有一個預感它是這些引號。退出字符串並嘗試「'」。$ _ SESSION ['username']。''' –

+0

試試這個WHERE username ='「。$ _ SESSION ['username']。''' –

+0

我會給你一個鏡頭,一秒我會讓你知道它是否工作... – Michael

回答

1

除了什麼康納說,你在這裏有一個嚴重的問題:

if($row['username']) 
    { 
     $querynewpass = 
    mysql_query("UPDATE members SET pass='".md5($_POST['passwordnew1']). 
       "' WHERE username='{$_SESSION['username']}'"); 
     $result = mysql_query($querynewpass) or die(mysql_error()); 
    } 

第一內線已經執行mysql_query並返回資源,分配給$ querynewpass

你重新發送的結果(資源)到另一個查詢,就好像它是包含要執行的SQL命令的字符串

這是函數的規格:

resource mysql_query (string $query [, resource $link_identifier = NULL ]) 

這是的mysql_query的正確使用(這是不贊成提到的人):

if($row['username']) 
    { 
     $querynewpass = 
       "UPDATE members SET pass='".md5($_POST['passwordnew1']). 
       "' WHERE username='{$_SESSION['username']}'"; 
     $result = mysql_query($querynewpass) or die(mysql_error()); 
    } 
+0

我該如何糾正? – Michael

+0

@Michael看我的編輯 – Itay

+0

謝謝sooooo很多! - 你做的編輯工作完美! – Michael

7

這裏有些東西不對,超過可以放在評論中。我很抱歉,我看不出你的錯誤是什麼,但如果你遵循第一點,它就會消失。

  1. 請勿使用mysql庫。它已被棄用,並已在PHP 5.5中被刪除(最終!)。目前它只適用於你,因爲你的PHP版本已經過期。您應該使用PDO或MySQLi。看看這篇文章的PDO信息:http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/

  2. 不要把任何變量,你沒有看到你的查詢腳本中生成,這包括SESSION變量。您的應用程序只需要一個缺陷,用戶可以將數據注入SESSION。把每一個變量都看作髒。如果你知道它不是 - 100%肯定 - 然後把它當作骯髒的。如果您使用PDO或MySQLi準備的語句,這不是問題。

  3. 你應該引用用戶的ID而不是用戶名。更快,更安全。

  4. 永遠不會將密碼原始存儲或簡單加密(如同普通的md5())存儲在數據庫中。至少,您可以使用以下內容進行加密:crypt($password, '$2a$07$sillystring' . sha1($password) . '$')並通過recrpyting密碼進行驗證並查看它是否匹配。這是一個非常基本的,更安全的方式。有很多文章寫在密碼醃製深入更多,值得一試。

+1

感謝您提供此信息Connor - >我會更多地關注使用PDO或MySQLi!再次感謝您的幫助! – Michael

0

這段代碼可以幫助您

$pass1 = md5(mysql_real_escape_string($_POST['password1'])); 
$newpass = md5(mysql_real_escape_string($_POST['passwordnew1'])); 
$username = mysql_real_escape_string($_SESSION['username']) 
$query = "SELECT id,username FROM members WHERE username = '$username' AND pass = '$pass1'"; 
$result = mysql_query($query); //that could also use , mysql_query($query,$yourconnection); 
if(mysql_num_rows($result)>0) 
{ 
    $updatequery = "UPDATE members SET pass='$newpass' WHERE username='$username'"; 
    $updateresult = mysql_query($updatequery) or die(mysql_error()); 
} 

請注意,mysql庫在p後不推薦使用hp ver 5.5.0