2013-05-25 14 views
2

我想獎勵用戶,如果他們引用了朋友。我一直在使用下面的代碼來做到這一點,但我擔心它可能不安全(用戶使用虛假賬號來遊戲)。我可以改進這個代碼嗎?還有其他的替代腳本可以做得更好嗎?通過鏈接腳本進行PHP引用。我的安全嗎?你知道更好的嗎?

if (isset($_GET['refer']) || isset($_GET['r'])) { 
global $database, $session; 
    if (!$session->logged_in) { 
     $username = mysql_safe($_GET['refer']); 
     if($database->usernameTaken($username)) { 
      $userip= getRealIP(); 

      $q="SELECT uname FROM " . TBL_USERS . " WHERE ipad = '$userip'"; 
       $result=mysql_query($q, $database->connection); 
       $result = mysql_numrows($result);  

      if ($result == 0) { 
       $_SESSION['referer'] = $username; 

      } 
     } 
    } 

    function getRealIP() 
{ 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet 
    { 
     $ip=$_SERVER['HTTP_CLIENT_IP']; 
    } 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy 
    { 
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 
    else 
    { 
     $ip=$_SERVER['REMOTE_ADDR']; 
    } 
    return $ip; 
} 
+0

你可以用'mysqli'或'PDO'開始而不是'mysql_ *'來避免sql注入 – Tifa

+0

你用什麼方法生成推薦鏈接?它是用一種隨機標記或其他東西生成的?如果它是隨機標記生成的,那麼你應該可以,因爲引用鏈接(標記)必須與數據庫中存在的鏈接相匹配。人們幾乎不可能猜到正確的引用標記以匹配數據庫中的引用標記,否則它將被拒絕。 – Faron

+0

我使用他們的用戶名。 ?refer = username – Charlie

回答

0

這取決於您期望的濫用程度。

非技術:

是獎勵轉讓的,他們是有形的還是不是?我可以創建一堆遊戲,然後使用它們來引用一堆其他帳戶,並在我的假帳戶上獲得獎勵並將它們發送給我的主帳戶?如果我創建了20個賬戶,並使用每個賬戶進行一次參考,那麼我是否收到20倍的獎勵(分佈在我的假賬戶中)。

我可以創建假帳戶並輕鬆地從不同的地方登錄。

選項:使索賠更難。如果用戶只需創建一個帳戶,這是微不足道的。如果他們必須登錄,然後執行X,Y和Z,那麼做起來很難,而且你會看到更少的假貨。

技術上:

第一關:你依靠標頭可以被欺騙,很容易IP地址(X_FORWARDED_FOR等)。所以,如果你試圖將其限制爲每IP一個,這是一個缺陷。其次,在您清理用戶名時,它看起來似乎並沒有在查詢中使用IP之前清理IP。如果您要進行手動消毒,請始終執行,或者您有漏洞。在這種情況下,你可以欺騙IP字符串 - 我不知道PHP會用一個假字符串做什麼,但是如果它沒有禁用它,你就會要求攻擊。

第三:我可以來自一系列網站。如果我硬重置我的DSL,大部分時間我都會得到一個新的IP。我可以登錄工作。我可以從我的網絡服務器中登錄。所有都有獨特的IP。我可以找到可能或可能不會真正設置這些字段的代理。

你可以看看其他標識。最簡單:餅乾。 Crazily更復雜:像這樣的事情:https://panopticlick.eff.org/index.php?action=log&js=yes

+0

感謝您的深入響應!我最終放棄了IP檢查,並且只有在用戶發佈了多少次的情況下才給出推薦信用! – Charlie

相關問題