2

如果用户推荐朋友,我想奖励他们。我一直在使用以下代码来执行此操作,但我担心它可能不安全(用户制作虚假帐户来进行游戏)。我可以改进这段代码吗?还有其他替代脚本可以做得更好吗?

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;
}
4

1 回答 1

0

这取决于您期望的滥用程度。

非技术性:

奖励是否可以转让,它们是否有形?我可以只创建一堆帐户,然后使用所有这些帐户来推荐一堆其他帐户,然后在我的假帐户上获得奖励并将它们发送到我的主帐户吗?如果我创建了 20 个帐户,并使用每个帐户推荐一次,我是否会获得 20 倍的奖励(分布在我的假帐户中)。

我可以轻松地创建假帐户并从不同的地方登录。

选项:让领取奖励变得更加困难。如果用户只需要创建一个帐户,这很简单。如果他们必须登录然后执行 X、Y 和 Z,则更难做到,而且您会看到更少的假货。

技术上:

首先:您依赖的 IP 标头(X_FORWARDED_FOR 等)很容易被欺骗。因此,如果您试图将其限制为每个 IP 一个,这是一个缺陷。

其次,当您清理用户名时,您似乎没有在查询中使用 IP 之前对其进行清理。如果您要进行手动消毒,请始终如一地进行,否则您会发现漏洞。在这种情况下,您可以欺骗 IP 字符串——我不知道 PHP 会如何处理伪造的字符串,但如果它没有对它产生错误,那么您就是在请求攻击。

第三:我可以来自一系列网站。如果我硬重置我的 DSL,我大部分时间都会获得一个新 IP。我可以从工作中登录。我可以从我的网络服务器框中登录。都有独特的IP。我可以找到可能会或可能不会实际设置这些字段的代理。

你可以看看其他的标识。最简单的:饼干。疯狂地更复杂:像这样的事情:https ://panopticlick.eff.org/index.php?action=log&js=yes

于 2013-05-25T20:42:25.023 回答