如果用户在远程设备上而不是在工作计算机上,如何限制网站访问? (工作时间跟踪应用程序)

Posted

技术标签:

【中文标题】如果用户在远程设备上而不是在工作计算机上,如何限制网站访问? (工作时间跟踪应用程序)【英文标题】:How to restrict website accessing, if user is on remote device and not on a work computer? (work time tracker app) 【发布时间】:2022-01-12 08:00:09 【问题描述】:

我想制作一个 php 网站,员工可以在其中自行登录/注销,这些日志将计入他们开始和结束工作日的时间。我想让他们只在他们的工作计算机上这样做,而不是在他们还在路上时使用手机,但他们希望避免“迟到”。

所以我正在为一些想法苦苦挣扎,但其中任何一个似乎都是正确的解决方案。

    仅允许将网站用于特定 IP 地址。但后来我意识到,在我们的地方,IP 地址是动态的,并且在我们地区将其更改为静态成本太高了。

    检查用户位置。但是后来我看到当我检查我的公共IP地址时,位置完全错误!我们的大楼甚至离装载区都不近。

    在工作计算机上使用 COOKIE/令牌。但是在您自己的设备上设置相同的 cookie 非常容易,而且我不是这里唯一的 IT 员工。

    检查 MAC 地址。正如我所读到的here,只有在特定情况下才有可能。

    阻止手机访问。但是检测移动设备是基于浏览器的,如果用户点击“请求桌面站点”,脚本会说这是一台计算机。

还有其他方法可以用来实现我的目标吗?我错过了什么吗? 例如,我可以将我的应用程序与其他一些允许我这样做的技术绑定吗?或者也许我应该尝试所有这些的组合?

我找不到任何脚本可以解决这个问题。在最坏的情况下,它不必“绝对安全”,但我希望在这个系统中尝试“欺骗”至少是困难、烦人或耗时的。

【问题讨论】:

【参考方案1】:

我会在办公室局域网中运行您的应用程序。除非他们可以远程桌面到办公室计算机或如果他们有 ***,否则没有人能够从外部访问它。但如果您在 IT 团队中,您可以修复办公室计算机的 IP 范围,以便排除 ***。

就安全性而言,无论如何,最好让它在您的局域网中运行。我确定你在某处有一台服务器,如果不是这样,那么你可以使用 NAS(Synology 提供 nginx、Apache、PHP 等等)或小 Rasperry Pie 或类似的东西。

如果您没有固定 IP,您也可以使用 DynDNS 并将其映射到子域,例如 company-name.dyndns.org,然后在您的 PHP 应用程序上您可以有一个 cron从域名获取 IP 地址并每分钟更新一次的作业(我确信它运行得很快)。然后它可以将其存储在配置文件中,这样:

<?php

define('ALLOWED_IP_FILE', 'allowed-ips.inc.php');

$ALLOWED_DOMAINS = [
    'your-company.dyndns.org',
    'you-at-home.dyndns.org',
];

$allowed_ips = [];

foreach ($ALLOWED_DOMAINS as $allowed_domain) 
    $ip = gethostbyname($allowed_domain);
    if ($ip !== $allowed_domain) 
        // Store with the IP in the key and value for ease when checking the IP validity.
        $allowed_ips[$ip] = $ip;
     else 
        fprintf(STDERR, "ERROR: Could not find the IP of $allowed_domain!\n");
    


$allowed_ips_export = var_export($allowed_ips, true);
$config_file_content = <<<END_OF_CONFIG
<?php
// Don't edit! This config file is generated by cron-ip-address.php.
\$ALLOWED_IPS = $allowed_ips_export;

END_OF_CONFIG;

if (file_put_contents(ALLOWED_IP_FILE, $config_file_content) === false) 
    fprintf(STDERR, 'ERROR: Could not write config file ' . ALLOWED_IP_FILE . "\n");

这会生成一个配置文件以包含在您的应用中。如果你运行我上面写的脚本生成的内容示例:

<?php
// Don't edit! This config file is generated by cron-ip-address.php.
$ALLOWED_IPS = array (
  '142.250.203.99' => '142.250.203.99',
  '23.201.250.169' => '23.201.250.169',
);

现在,在您的应用中,只需包含它并测试 IP 是否存在于 $ALLOWED_IPS 数组中:

<?php

include ALLOWED_IP_FILE; // If this is declared in a common config file.
// include 'allowed-ips.inc.php'; // If you haven't got a common config file.

if (!isset($ALLOWED_IPS[$_SERVER['REMOTE_ADDR']])) 
    http_response_code(403);
    die('Sorry, you cannot access it from here.');

【讨论】:

【参考方案2】:

理想情况下,如果您真正想要跟踪的是员工何时在工作场所并登录/登录了多长时间,那么通过域控制器跟踪本地机器登录可能会更好 - 一种可从 Internet 访问的方法正是由于您提到的原因,它不是最理想的。

如果您有一个用户无法通过隧道进入但可以从他们的工作机器访问的 Intranet,我会说仅在该 Intranet 中托管您的登录页面是使用您建议的方法实现您想要的最简单的方法。

或者,如果员工工作机器在域控制器下使用 Windows - 您可以限制对 Windows 证书存储的访问,然后安装/推送证书并要求该证书通过您的服务器配置提供。在这种情况下,是否可以从 Internet 访问该网站并不重要。如果工作机器不在 Windows 上,我相信会有类似的解决方案。

This admittely old question 提供了一些关于如何从 Web 服务器(在这种情况下为 IIS)要求客户端证书的正确方向。

【讨论】:

以上是关于如果用户在远程设备上而不是在工作计算机上,如何限制网站访问? (工作时间跟踪应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的设备上而不是在 iPhone 6 模拟器中运行我的 React Native 应用程序?

iPad应用程序仅在设备上而不是在模拟器中加载笔尖时崩溃

如何在浏览器中访问远程 node.js 应用程序,而不是在本地主机上

引导导航栏崩溃在计算机上而不是在 iPhone 上工作

在ADUC中设置登录到工作站功能,导致远程桌面访问客户端 报错:系统管理员已经限制你登录的计算机

IOS5 中的本地通知 - 如何让它在屏幕上而不是在通知中心弹出?