2010-06-09 158 views
0

我創建了自己的這個賬號註冊激活腳本,我都檢查一遍並再次發現錯誤,我沒有看到一個具體的錯誤...帳戶激活PHP

您會是這樣:

http://domain.com/include/register.php?key=true&p=AfRWDCOWF0BO6KSb6UmNMf7d333gaBOB

它來自電子郵件,當用戶點擊它,他們重定向到該腳本:

if($_GET['key'] == true) 
{ 
    $key = $_GET['p']; 

    $sql = "SELECT * FROM users 
      WHERE user_key = '" . $key . "'"; 

    $result = mysql_query($sql) or die(mysql_error()); 

    if(mysql_affected_rows($result) > 0) 
    { 
     $sql = "UPDATE users 
       SET user_key = '', user_active = '1' 
       WHERE user_key = '" . $key . "'"; 

     $result = mysql_query(sql) or die(mysql_error()); 

     if($result) 
     { 
      $_SESSION['PROCESS'] = $lang['Account_activated']; 
      header("Location: ../index.php"); 
     } 
     else 
     { 
      $_SESSION['ERROR'] = $lang['Key_error']; 
      header("Location: ../index.php"); 
     } 
    } 
    else 
    { 
     $_SESSION['ERROR'] = $lang['Invalid_key']; 
     header("Location: ../index.php"); 
    } 
} 

它甚至沒有工作,我查看數據庫中的用戶與該密鑰,它匹配,但它繼續作爲一個錯誤,這是非常討厭我。數據庫是正確的,表和列是正確的,沒有錯誤的數據庫,這是腳本不起作用。

幫幫我,夥計。

謝謝:)

+0

mysql_real_escape_string是你的朋友。您應該轉義您的參數化屬性(例如來自URL的屬性)。在這種情況下,您的$ key變量。 http://ar.php.net/manual/en/function.mysql-real-escape-string.php – Lombo 2010-06-09 23:58:24

+0

我已經知道了,我有一種被稱爲safeClean(功能)已包含的功能,以消毒數據,但我刪除它以確保它不是影響,因此它沒有,也沒有使用過的代碼。 MySQL轉義很好。 – MacMac 2010-06-10 00:12:18

回答

3
  1. 變化$_GET['key'] == true$_GET['key'] == "true"
  2. 你這樣做if之前,一個成功的mysql_connect(...)mysql_pconnect(...)
  3. 更改mysql_affected_rows($result);mysql_num_rows($result);。受影響,您可以使用DELETEUPDATESQL語句
  4. 在第二個如果被打開之前,在第二個之前添加mysql_result(...),mysql_free_result($result);以釋放分配給先前結果的內存。
  5. if($result)更改爲if(mysql_affected_rows($result));。你可以在這裏做到這一點。
  6. header(...);函數調用的後面添加一個return 0;exit(0);取決於您的完整代碼邏輯。
  7. 您正在使用$key變量SQL語句,讓你的代碼上SQL注入攻擊拿到找零$key = $_GET['p'];$key = mysql_real_escape_string($_GET['p']);
  8. 更安全,我認爲你在header()功能定位失敗。在header()的url地址應該是全部像:http://www.example.com/somewhere/index.php
  9. 並檢查你的$_GET['p']變量是否存在!如果不存在,並且存在$_GET['key'],則可以找到所有激活的用戶。然後我認爲如果你有user_activated標記,那麼將user_key設置爲「'是不合適的。
+0

已經試過,沒有報價。 MySQL連接很好。 – MacMac 2010-06-09 23:56:02

+0

我知道,但這可能不適用於未來版本的PHP引擎。 – Svisstack 2010-06-09 23:56:50

+0

$ _GET [「鑰匙」] == true的實際評估,如果$ _GET [「關鍵」]有任何value..so你可以打電話給你的腳本鍵=假,它仍然會通過validation..Although這並未」不能解決問題,它只是一個警告;) – 2010-06-10 00:00:45

0

你不應該使用:

if(mysql_affected_rows($result) > 0) 

您應該使用mysql_num_rows()

-1

您的問題是:

$result = mysql_query($sql) or die(mysql_error()); 

「或」 讓您的發言boolean所以$結果得到一個True而不是由mysql_query返回的值()

echo 'Hello' or die('bye'); // outputs nothing, because result is True not 'Hello' 

3 or die() == True; // true 
3 or die() != 3; // true 

相同||並且它是邏輯語句的操作符。

這將工作:

$result = mysql_query($sql); 
if(!$result) die(mysql_error());  

同樣的錯誤是在幾個小時前提出:link


的包裝箱,或者可以使用:

defined('FOO') or 
    define('FOO', 'BAR'); 

mysql_connect(...) or die(...); 

mysql_select_db(....) or die(...); 

mysql_query('UPDATE ...') or die(...); 

if(FOO or BAR) { ... } 
+0

但是,如果在第一個值或表達式爲真,下一個不那麼如果請求mysql_query導致可變執行不是假該模具()從來沒有執行。這很好。這個語法無處不在,無處不在。 – Svisstack 2010-06-10 00:07:25

+0

至少不要那麼無知,甚至不喜歡測試你甚至不喜歡的東西。 – Ski 2010-06-10 00:18:26

+1

我一直以這種方式使用「或」,它從來沒有問題。 – alternative 2010-06-10 00:24:48