我正在使用 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'] 之上的文件并不“安全”。
我不知道你在这里说什么。无法直接访问文档根目录之外的内容(包括到其他路径的映射)。
但这足够安全吗?
我不知道这如何加强你的约束
我们不知道在这种情况下你到底想要多少安全