首页 > 解决方案 > 仅当请求来自一页时如何响应?

问题描述

我正在开发一个 php 网站。我有一个名为 pageX.php 的页面,在该页面上我进行了 Ajax 调用:

 xmlhttp.open("GET", "/getData/dat?q=" + str, true);

我想避免显示此请求中包含的数据。此外,我希望仅当它来自 pageX.php 时才能响应此请求,而不是其他任何地方。

我曾尝试使用 PHP 会话,但它不起作用——如果您直接从浏览器地址栏转到服务器,服务器仍会响应请求

mysite.com/getData/dat?q=1

你能帮忙解决这个问题吗?

标签: javascriptphp

解决方案


CORS不需要向同一域上的资源发送请求,因为它是从同一来源发送的。这里的问题是你有一个开放的路由,它接受基于该主键响应敏感信息的参数。您需要关闭该路线。

为此,您可以使用JWT之类的东西为用户生成承载。有点像,“记住我的令牌”。这可以在用户进行身份验证并存储为会话时生成,如下所示:

session_start();

/**
 * Your authentication logic here
 * Which for example returns a uid of 1
 */

$_SESSION['ssid'] = \Firebase\JWT\JWT::encode((object) ['uid' => 1], 'your_key');

您的封闭路线现在看起来像这样:

session_start();

header('Content-Type: application/json');

if(!isset(($bearer =& $_SESSION['ssid'])))
    die(json_encode(['error' => 403])); // Forbidden

try {
    $user = \Firebase\JWT\JWT::decode($bearer, 'your_key', array('HS256'));
    // Your logic
    // $user->uid to get the ID
} catch (Exception $e) {
    // Handle exceptions where the bearer has either expired or is invalid
}

然后,(JQuery 示例)您可以像这样简单地请求封闭路线:

(function ($) => {
    $.get('/getData', (response) => {
        // Logic
    });
})(JQuery);

现在,这可以阻止用户使用自己的参数伪造请求。


推荐阅读