【问题标题】:Ajax post request vulnerabilityAjax 发布请求漏洞
【发布时间】:2015-07-24 17:01:06
【问题描述】:

我正在尝试记录用户对包含广告的 div 中特定 iFrame 的点击,以阻止有问题的 IP 地址,从而防止那些试图向广告发送垃圾邮件的人再次点击它。在用户的每一次点击中,一条记录将被插入到 mySQL 数据库的一个表中,其中包括:

  1. IP 地址
  2. 点击次数计数器
  3. Unix 时间戳

每个用户/IP 地址都有权在 24 小时内点击广告 3 次。 为了检测 iFrame 广告的每次点击,我使用了iframeTracker-jquery 类并实现了如下 JavaScript 代码:
index.php:

<?php include 'AdProtection.php'; ?>

<html>

<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="js/jquery.iframetracker.js"></script>
    <script>
        jQuery(document).ready(function($) {
                    $('.iframetrack iframe').iframeTracker({
                            blurCallback: function() {
                                console.log("Click has been detected!");
                                $.ajax({
                                        type: "POST",
                                        url: "update.php"
                                    );
                                }
                            });
                    });
    </script>
</head>

<body>
    <div class="iframetrack" id="adsense_frame">
        <?php //Returns true when a user 's IP address isn't currently blocked by checking in Database. if(AdProtection::protectAd()) echo '<iframe width="728" height="90" src="js/demo/sample-iframe/red.html" frameborder="0" allowtransparency="true" scrolling="no"></iframe>'; ?>
    </div>
</body>

</html>

更新.php:

<?php

function update($odb)
{
    $sql=$odb->prepare('INSERT INTO system (ip, clicks, timestamp) VALUES(:ip, clicks+1, :timestamp) ON DUPLICATE KEY UPDATE clicks = clicks+1, timestamp = :timestamp');
    $sql->execute(array(':ip' => ip2long($_SERVER['REMOTE_ADDR']),':timestamp' => time()));
}

//PDO Connection
include ( "db.php");
$sql=$odb->prepare('SELECT clicks, timestamp FROM system WHERE ip= :ip');
$sql->execute(array(':ip' => ip2long($_SERVER['REMOTE_ADDR'])));
$data = $sql->fetch();
if($data != null)
{
    if($data['clicks'] % 3 == 0)
    {
        if(($data['timestamp'] + (24 * 60 * 60)) < time())
            update($odb);
        else
            //User is currently blocked.
    }
    else
        update($odb);
}
else
    update($odb);

在实现这个 JavaScript 代码/jQuery POST 请求时有两个关键问题:

  1. 代码可以由个人操作/修改,因为 JavaScript 是一种客户端语言。
  2. 可以在 update.php 文件上生成垃圾邮件。

我该如何处理这些问题?

【问题讨论】:

  • 为什么重要?如果您的 update.php 中的“垃圾邮件”是指快速重复访问,那么用户会很快将自己锁定。
  • 如果多个机器人同时发送垃圾邮件怎么办?此外,ajax 请求可以被操作为不会向 update.php 文件发送请求。
  • 我认为您需要更加明确自己的目标。为什么需要阻止广告流量?这就是广告的重点,以吸引流量。如果您对每天的点击给予赞扬,那么谁在乎他们是否超过了他们的 3 次点击。您记录他们的 3 次点击并让他们继续发送垃圾邮件。
  • 我想阻止这些 IP 地址以防止垃圾广告,这就是为什么我限制每个 IP 地址在 24 小时内点击 3 次。
  • 检查ip,如果ok,则显示iframe,空格如果他们已经投票3次则不显示iframe

标签: javascript php ajax security spam


【解决方案1】:
  1. Js 代码可能被任何人作为其客户端操作,您所能做的就是最大限度地降低您的代码可能被其他脚本禁用的风险,以便编写您的 js 以仅使用私有方法和自执行函数中的变量。因此代码将在全局命名空间中不可见,您可能还需要复制全局可用对象(如文档或 getElementById)的定义,因为它们可能会更改它们而不是您的代码本身。之后混淆代码并缩小它。

  2. 对于 PHP,您可能需要实现某种身份验证才能与您的 js 脚本配对使用,因为这只不过是保护任何访问请求,因此可能是 IP 或会话验证。 Yo还可以实现一些其他的服务器端机制,以防止该脚本被某些IP地址访问。

您也可以决定完全不为某些 IP 地址或设备指纹 http://en.wikipedia.org/wiki/Device_fingerprint 显示 iframe,这将不依赖于客户端逻辑,这可能会比您提出的解决方案更安全。

【讨论】:

    【解决方案2】:

    在服务器端进行检查。总是。 您对客户既没有控制权也没有可靠的知识,所以对于任何敏感的东西,不要相信它。
    最终,用户可能只需下载开源浏览器的源代码并根据自己的意愿进行修改。

    禁用客户端的东西是一个很好的加分,如果它表明功能不可用,它可能会为您和您的用户节省一些时间和带宽,但会有人试图规避它,对于那些你需要做好准备。
    禁用服务器端的东西意味着只是拒绝执行,即只需在您的评论 //User is currently blocked. 之后放置一个 exit;,就应该这样做。

    对于您的第二个问题:是的,update.php 可能会收到垃圾邮件,但任何其他 PHP 脚本也可能会收到垃圾邮件。
    我知道的每一个合理的网络服务器都有某种方式来限制客户端在一定时间内可以发出的请求数量。
    Lighttpd 有一个原生的mod_evasive,nginx 有一个HttpLimitReqModule,对于 Apache 有很多东西,请参阅this SO answer。
    如果垃圾邮件超出了您的 Web 服务器的能力,那么是时候研究 DDos 保护了。

    【讨论】:

    • 如何退出; 'update.php' 文件中的命令在尝试处理客户端操作时可以帮助我吗?假设客户端/用户已将 ajax POST 请求修改为 url:"" 而不是 url:"update.php"。这样一来,包含他IP地址的记录就不会通过update.php文件插入,从而绕过系统。感谢您的回复。
    • 您的意思是,您显示了一个指向外部广告的直接链接,并且想要一种确定是否已被点击的防弹方法?我相信只有通过您的服务器中继所有内容才有可能。创建一个获取广告内容的 PHP 文件,修改链接以指向 update.php 并回显它。将其显示在页面上而不是广告上,并在 update.php 的末尾将用户重定向到实际的广告页面 (header('Location: ...');)。除此之外,您几乎无能为力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2013-09-16
    • 2011-06-02
    • 2016-06-28
    相关资源
    最近更新 更多