【问题标题】:PHP referral by link script. Is mine secure? Do you know any better ones?通过链接脚本引用 PHP。我的安全吗?你知道更好的吗?
【发布时间】:2013-05-25 19:21:06
【问题描述】:

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

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

【问题讨论】:

  • 您可以先使用mysqliPDO 而不是mysql_* 来避免sql 注入
  • 您使用什么方法生成推荐链接?它是用某种随机令牌或其他东西生成的吗?如果它是随机生成的令牌,那么您应该没问题,因为推荐链接(令牌)必须与数据库中存在的链接匹配。人们几乎不可能猜出正确的推荐令牌来匹配您数据库中的那个,否则,它将被拒绝。
  • 我使用他们的用户名。 ?refer=用户名
  • 我希望mysql_safe 不是在做mysql_real_escape_string 的工作的自定义尝试。
  • 需要注意的一点:即使您使用了一组返回IP地址的方式,在NAT之后的用户可能仍然返回相同的IP。假设特定公司的每个人都开始互相推荐。相同的 IP,但您可能永远不会给予任何信任。我见过有组合方法的代码:IP 地址、用户代理(这可能因用户而异,但并非总是如此)、Cookie 和节流(即,它可能不会起飞这么快,所以信用是仅在每个请求相隔超过 5 分钟时才知道)。一般来说,很难阻止用户玩游戏。 :-/

标签: php security session


【解决方案1】:

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

非技术性:

奖励是否可以转让,它们是否有形?我可以只创建一堆帐户,然后使用所有这些帐户来推荐一堆其他帐户,然后在我的假帐户上获得奖励并将它们发送到我的主帐户吗?如果我创建了 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

【讨论】:

  • 感谢您的深入回复!我最终放弃了 ip 检查,并且仅在用户发布 x 次时才给予推荐信用!
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多