阻止具有有效会话的用户直接访问 json feed

阻止具有有效会话的用户直接访问 json feed

我正在使用 fullcalendar 来获取 json feed(https://fullcalendar.io/docs/events-json-feed)。

<script>
var calendar = new Calendar(calendarEl, {
  events: '/myfeed.php'
}); 
</script>

在这里,我正在从谷歌日历中获取事件。

<?php
$api_key = 'xxx';
$calendar_id = 'xxx';

$url = "https://www.googleapis.com/calendar/v3/calendars/$calendar_id/events?key=$api_key";
$response = file_get_contents($url);
$events = json_decode($response, true);

$formatted_events = array();
foreach ($events['items'] as $event) {
$formatted_events[] = array(
'title' => $event['summary'],
'start' => $event['start']['dateTime'] ?? $event['start']['date'],
'end' => $event['end']['dateTime'] ?? $event['end']['date']
);
}
echo json_encode($formatted_events);
?>

在地址栏中输入地址时<myserver>/myfeed.php,也可以直接访问 json 元素。

[{"title":"title1","start":"2023-09-01T10:30:00+02:00","end":"2023-09-01T12:30:00+02:00"},{"title":"title2","start":"2023-09-01T14:30:00+02:00","end":"2023-09-01T16:30:00+02:00"}]

由于此供稿位于网站的私人部分,因此很容易阻止任何人访问该供稿(例如使用isset($_SESSION['user']myfeed.php

如何防止具有有效会话的用户直接输入 my.feed.php 的地址然后访问 feed

我以为我可以将myfeed.php其放置在上面,$_SERVER['DOCUMENT_ROOT']但我猜测允许 js 代码(参见上文)访问位于上面的文件并不“安全” $_SERVER['DOCUMENT_ROOT']

最好的

编辑

使用

<?php
$postedUrl = $_SERVER['REQUEST_URI'];
if ( $postedUrl !='/admin/myfeed') {
// fetch events 
}
?>

看起来myfeed.php似乎有效。但这足够安全吗?

答案1

简短的回答是你不应该尝试。

是的,您可以采取一些措施,但这些措施会很复杂且脆弱。一个明显的解决方案是在用户访问应允许访问日历的页面时,在服务器端会话中设置一个有时间限制的一次性令牌。

允许 js 代码(见上文)访问 $_SERVER['DOCUMENT_ROOT'] 之上的文件并不“安全”。

我不知道你在这里说什么。无法直接访问文档根目录之外的内容(包括到其他路径的映射)。

但这足够安全吗?

  1. 我不知道这如何加强你的约束

  2. 我们不知道在这种情况下你到底想要多少安全

相关内容