停止恶意POST请求

时间:2016-07-15 15:36:47

标签: javascript php ajax security post

我有一个AJAX函数可以调用我网站上的页面。

$(document).on('click', thisIdentity, function() {
    var trigger = $(this);
    var items = trigger.attr('data-values').split('_');
    $.ajax({
        type: "POST",
        url: "/mod/mypage.php",
        data : { pid : item[0], uid : item[1] },
        dataType: "json",
        success: function(data) {
           if(data.job == 1) {
              // do something
           }
        }
    });
});

现在这样可以正常工作并按预期进行。但是,如果我使用 POSTMAN 等任何第三方应用,并向 www.xyz.com/mod/mypage.php 发出 POST 请求参数 pid:1和uid:2 。它仍然会通过并更改我的数据库。

  

无论如何都要检查我的请求是否已生成   域/服务器?

     

如何在我的域外停止此类POST请求?

我认为有一件事是在此请求之前生成一个令牌并在SESSION中设置,并在mypage.php中检查是否设置了令牌。这是一种可行的方式吗?

2 个答案:

答案 0 :(得分:0)

这正是CSRF令牌的用途。用户必须首先导航到页面,生成要提交的令牌,而不导航到页面的ergo将使任何POST请求无效。

然而,试图阻止某人从POSTman这样的实用程序发出请求到你的终端是徒劳的。您必须验证对端点的每个请求,在这种情况下,只需检查照片ID是否由提交客户端拥有。

OWASP提供了对CSRF的体面描述:

  

跨站点请求伪造(CSRF)是一种攻击,它强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作。 CSRF攻击专门针对状态变化请求,而不是数据被盗,因为攻击者无法查看对伪造请求的响应。

验证流程示例

<强>的login.php

<?php

// Establish DB connection, validate

$_SESSION['id'] = $db->getUserId();
$_SESSION['admin'] = $db->getAdminStatus();

<强> Delete.php

<?php

if (!$db->isPhotoOwner($_POST['pid'])) {
    exit;
}

// Delete photo flow

<强> admin.php的

<?php

if (!$_SESSION['admin']) {
    die("Not admin.");
}

// Do admin action or whatever

答案 1 :(得分:-1)

您可以让调用页面使用$ _SERVER ['SCRIPT_NAME']标识自己,并将该值写入隐藏的输入字段或$ _POST,并在处理开始时检查它。您选择的任何确认值都可能有效。

如果他们已经在模仿你的JSON数据,那么可以将它放到javascript中,用PHP动态地在页面服务上写代码值。