首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax post请求漏洞

问Ajax post请求漏洞
EN

Stack Overflow用户
提问于 2015-05-13 12:05:16
回答 1查看 1.8K关注 0票数 0

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

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

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

index.php:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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文件上生成垃圾邮件。

我如何处理这些问题?

EN

回答 1

Stack Overflow用户

发布于 2015-05-13 12:31:06

  1. Js代码可能会被任何人操纵,作为它的客户端,您所能做的就是将代码被其他脚本禁用的风险降到最低,这样就可以编写js,以便在自动执行函数中只使用私有方法和变量。因此,代码在全局命名空间中是不可见的,您还可能需要复制全局可用对象(如文档或getElementById)的定义,因为它们可能会更改它们,而不是您的代码本身。在那个模糊的代码之后并缩小它。
  2. 对于PHP,您可能需要实现某种类型的身份验证,以便与js脚本一起工作,因为这只不过是保护任何访问请求的安全,所以可能是IP或会话验证。Yo还可以实现其他一些服务器端机制,以防止某些IP地址访问该脚本。

您还可以决定不对某些ip地址或不依赖于客户端逻辑的设备指纹指纹显示iframe,这可能会使其比您提出的解决方案更安全。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30214286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档