停止恶意开机自检请求

Stop Malicious POST requests

本文关键字:请求 开机自检 恶意      更新时间:2023-09-26

我有一个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)并使用参数 pid : 1 和 uid : 2 发出 POST 请求以 www.xyz.com/mod/mypage.php。 它仍然通过并对我的数据库进行更改。

无论如何可以检查请求是从我的 仅域/服务器?

如何阻止我的域之外的此类 POST 请求?

我想的一件事是在此请求之前生成一个令牌并在 SESSION 中设置并检查我的页面.php是否设置了令牌。这是一个可行的方法吗?

这正是CSRF代币的用途。用户必须先导航到该页面,这会生成一个要提交的令牌,因此,如果不导航到该页面,则任何POST请求都将失效。

但是,试图阻止某人从 POSTman 等实用程序向您的端点发出请求是徒劳的。您必须对端点的每个请求进行身份验证,在这种情况下,只需检查照片 ID 是否归提交客户端所有。

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

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

示例验证流程

登录.php

<?php
// Establish DB connection, validate
$_SESSION['id'] = $db->getUserId();
$_SESSION['admin'] = $db->getAdminStatus();

删除.php

<?php
if (!$db->isPhotoOwner($_POST['pid'])) {
    exit;
}
// Delete photo flow

管理员.php

<?php
if (!$_SESSION['admin']) {
    die("Not admin.");
}
// Do admin action or whatever

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

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