【发布时间】:2020-02-04 21:04:27
【问题描述】:
我正在为 Nextcloud (16) 构建一个小应用程序。我必须在外部 PHP 文件中执行一些代码,而不是在 Nextcloud 应用程序中。 此页面必须防止未经授权的访问。我想用现有的 Nextcloud 会话 cookie 来实现这一点。
目前,我从用户的浏览器读取nc_session_id cookie 并检查此会话是否存在于PHP 的会话路径中。这应该是安全的,因为攻击者通常无法猜到 id。
这是浏览器中 Nextcloud 会话的样子:
我试图检查 cookie
session_status('nc_session_id') != PHP_SESSION_NONE
但这总是返回 int(1) --> 会话不存在,因为我必须在此之前运行 session_start()。但是在这种特殊情况下,外部页面本身永远不会启动新会话 - 它应该只检查有效的 Nextcloud 会话是否已经存在。
我当前的代码似乎可以完成这项工作:
session_name('nc_session_id');
$sessid_cook = filter_input(INPUT_COOKIE, "nc_session_id", FILTER_SANITIZE_STRING);
$sess_path = session_save_path().'/sess_'.$sessid_cook;
if(isset($_COOKIE['nc_session_id']) &&
isset($_COOKIE['nc_username']) &&
file_exists($sess_path)) {
echo "Session okay";
session_start();
} else {
echo "Access denied";
exit;
}
// my protected logic here
如果我在浏览器中操作会话 cookie,服务器上的 PHP 代码将找不到该操作 cookie 的会话文件。所以访问被拒绝。
这在我当前的设置中有效,但如果会话由 Redis 或 Memcache 处理会发生什么?无法在本地检查 cookie。
在开始 PHP 会话之前,有没有更好的方法来“验证”会话 cookie?
我的解决方案是安全的还是有一些缺陷?
【问题讨论】:
-
FWIW,假设会话存储在磁盘上的文件中并不是一个好主意。 PHP 会话是一个抽象的东西,根据设置,它们可以存储在数据库、内存缓存、其他服务器的磁盘或任何其他存储机制中。如果您需要查找会话“文件”,您可能做错了什么。
标签: php session session-cookies nextcloud