Ajax发布请求漏洞

时间:2015-05-13 12:05:17

标签: javascript php ajax security spam

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

  1. IP地址
  2. 点击计数器
  3. Unix时间戳
  4. 每个用户/ 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>
    

    update.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文件上发送垃圾邮件。
    3. 我该如何处理这些问题?

2 个答案:

答案 0 :(得分:2)

检查服务器端。总是。 你既没有控制也没有关于客户的可靠知识,所以对于任何敏感的东西,都不要相信它 最终,用户可以下载开源浏览器的源代码并按照他的意愿进行修改。

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

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

答案 1 :(得分:-1)

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

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

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