javascript - 仅当请求来自一页时如何响应?
问题描述
我正在开发一个 php 网站。我有一个名为 pageX.php 的页面,在该页面上我进行了 Ajax 调用:
xmlhttp.open("GET", "/getData/dat?q=" + str, true);
我想避免显示此请求中包含的数据。此外,我希望仅当它来自 pageX.php 时才能响应此请求,而不是其他任何地方。
我曾尝试使用 PHP 会话,但它不起作用——如果您直接从浏览器地址栏转到服务器,服务器仍会响应请求
mysite.com/getData/dat?q=1
你能帮忙解决这个问题吗?
解决方案
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);
现在,这可以阻止用户使用自己的参数伪造请求。
推荐阅读
- html - 活动输入表单 - 出现标签 - 纯 css 解决方案
- ios - 设置 UITextField 的文本不会更新 UI,直到它获得焦点 | iOS
- nginx - Nginx 不监听 80 端口
- javascript - 如何使用反应挂钩订阅更改 redux?
- kubernetes-helm - 如何在 okd 环境中安装的 jenkinsx 中将 helm 从 2 升级到 3 版本
- reactjs - 如何在创建反应应用程序中使用 scss 变量?
- dart - 在飞镖中,使用第一个字符串的长度将字符串分成两部分
- c - 为什么我们在初始化链表的根时使用 node* 而不是只说 node ?
- r - 是否有可以在 R 中找到特定站点的服务器时间的编码?
- unity3d - 2D 盒子碰撞器在 Unity 中不起作用