【问题标题】:Uniquely recognize Client on localhost唯一识别本地主机上的客户端
【发布时间】:2017-02-09 08:21:10
【问题描述】:

我在未连接到互联网的 Windows 笔记本电脑上安装了 apache。笔记本电脑有多个用户帐户。假设其中两个用户帐户是“Adam”和“Sally”。我在 localhost 上有一个项目,需要通过 Chrome 浏览器区分不同的 Window 用户。

我知道直接通过浏览器检测用户名是严重的安全沙箱违规行为,但我不在乎:我完全控制计算机并且该项目无法通过网络访问,因此不存在安全问题。我愿意以任何可以想象的方式作弊,包括构建自定义 .exe 来提供帮助。我只需要区分不同的帐户。它不需要是用户名,但任何替代 ID 都需要为该给定用户保留。

我要求跳出框框思考。

如何创建一个可以在 Chrome 中打开的页面,该页面会显示“Hi Adam”或“Hi Sally”甚至“Hi -=[GUID]=-”,而访问者无需输入他们的姓名/guid。

【问题讨论】:

  • JavaScript 无法识别用户。但是您可能可以编写一个扩展来做到这一点。
  • 明确地说,阻止您的不是 JavaScript,而是 DOM 和浏览器安全性保护您。

标签: javascript php apache google-chrome


【解决方案1】:

您可能应该为此使用 NW.jsElectron 之类的东西而不是 chrome,这样您就不必牺牲安全性。

这是我运行 nw.js sdk 并仅加载演示页面、调出开发工具并检索我的用户名的照片。 很直接。遵循节点文档并在那里做任何你想做的事情。

您可以通过任务计划程序或HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 中的注册表或执行echo setCurrentUser("%USERNAME%"); > c:\your_project_directory\set-current-user.js 之类的本地组策略获得batch file that runs on startup,然后您只需要一个定义<script>function setCurrentUser(s) { alert("Hello "+s); /* ... */ }</script> 的脚本,然后是像@ 这样的脚本导入987654337@

如果您只想在文件系统中执行任何操作,请将启动 Chrome 的快捷方式更改为 --allow-file-access-from-files --user-data-dir=c:\your_project_directory --disable-web-security 并重新启动 PC(或直接终止所有 chrome.exe 进程,包括后台)。

编辑:更新了关于使用来自 Pritam Banerjee 的 --allow-file-access-from-files 的注释。如果你走那条路,他就会得到荣誉。 :)

如果您有兴趣尝试 NW.js,这里有一个完整的示例:

package.json

{
  "name": "nw-hello-user",
  "version": "0.0.1",
  "main": "index.html"
}

index.html

<!DOCTYPE html>
<html>
<head>
<title>Hello!</title>
</head>
<body>
    Hello <script>document.write(process.env.USERNAME)</script>!
</body>
</html>

这是命令行:

这是最终产品!

【讨论】:

  • --allow-file-access-from-files 不再适用于 Chrome。您将不得不使用:--disable-web-security --user-data-dir
  • 感谢您的提醒,添加到帖子中,添加提及。投票赞成。
【解决方案2】:

由于您使用 PHP 标记了您的问题,您只需创建一个 index.php 文件,其内容如下:

Hi <?= getenv("USERNAME") ?>

getenv("USERNAME") 返回 USERNAME 环境变量的值。

更新:感谢 TylerY86 提供了更正确的方法来获取用户名。另请注意他在下面的评论:

您还必须确保 Apache 实例在 用户的上下文,而不是作为服务。如果你尝试这个例子,如果 你会得到类似 SYSTEM 或 IUSR_MACHINE 的东西,而不是用户 名称,您需要进行调整。

【讨论】:

  • whoami 输出 domain\user (其中域可能是计算机名,没有正确的域),您可能希望 getenv('USERNAME') 只获取用户,或 get_current_user()更直接(可能仍包括域)。
  • 使用 PHP 是解决这里问题的最简单方法,如果它是作为 WAMP 包的一部分安装的
  • @TylerY86 谢谢,我把它改成了 get_current_user()。我验证它只获取用户名部分。
  • 对您的答案投了赞成票。学究式的正确代码和努力的人的粉丝。 :)
  • Ah crap,你不想要get_current_user,就像你说的,它得到了脚本文件的所有者...... whoami 和 getenv 会更好。您还必须确保 Apache 实例在用户的上下文中运行,而不是作为服务运行。如果你尝试这个例子,如果你得到SYSTEMIUSR_MACHINE 这样的东西而不是用户名,你需要调整。
【解决方案3】:

据我所知,您有 2 个选择。

1) 您可以要求用户在他们第一次使用该页面时识别他们自己并将其存储到本地存储中。由于这些是机器上的不同用户,他们的 localStorages 应该是分开的。

2) 您可以在本地主机上部署一个小型 Web 服务,该服务从系统获取用户凭据并在 GET 请求时返回。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2017-02-09
    • 2015-07-11
    • 1970-01-01
    • 2014-05-29
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多