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

How to restrict website accessing, if user is on remote device and not on a work computer? (work time tracker app)

我想制作一个 PHP 网站,员工可以在其中记录 in/out 自己,这些日志将计为他们开始和结束工作日的时间。我想让他们只在他们的工作计算机上这样做,而不是在他们还在路上的时候在他们的 phone 上这样做,但他们想避免“迟到”。

所以我正在努力思考一些想法,但其中任何一个似乎都是正确的解决方案。

  1. 只允许特定 IP 地址使用该网站。但后来我意识到,在我们这里 IP 地址是动态的,在我们地区将其更改为静态成本太高了。

  2. 检查用户位置。但后来我发现,当我检查我的 public IP 地址时,位置完全错误!我们的大楼甚至离装载区域都不近。

  3. 在工作电脑上使用 COOKIE/token。但是在您自己的设备上设置相同的 cookie 非常容易,而且我不是这里唯一的 IT 员工。

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

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

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

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

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

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

或者,如果员工工作机器在域控制器下使用 windows - 您可以限制对 Windows 证书存储的访问,然后 install/push 证书并要求通过您的服务器配置呈现。在这种情况下,网站是否可以从互联网访问并不重要。如果工作机器不在 Windows.

上,我敢肯定也有类似的解决方案

给出了一些关于如何从 Web 服务器(在这种情况下是 IIS)要求客户端证书的正确方向的指示。

我会运行你在办公室局域网中的应用程序。没有人可以从外部访问它,除非他们可以对办公室计算机进行远程桌面操作或者他们有 VPN。但是,如果您在 IT 团队中,您可以修复办公室计算机的 IP 范围,以便您可以排除 VPN。

就安全性而言,无论如何将它 运行 放在您的 LAN 中可能会更好。我确定您在某个地方有服务器,如果不是这样,那么您可以使用 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.');
}