阻止访问 lynx 中的本地主机

Block access to localhost in lynx

我是运行一个主要由bash脚本组成的BBS。

碰巧今天刚好进入Lynx,按“/”回车。想象一下当它吐出我的根目录的内容时我的恐惧!我一直在 Windows 中这样做(在浏览器中访问本地文件),但我从来没有想过要在这里考虑。

具有讽刺意味的是,有一个 lynx 标志可以 禁用 非本地主机位置,但我在这里需要做的是相反的方法。本地机器上有敏感的数据库密码和其他受保护的信息。我听说有几台类似的机器以这种方式被典当,通过在远程机器上使用 Lynx 运行 利用此漏洞,在本例中是 BBS。

我试图通过设置一个 if-else 语句来解决这个问题。不幸的是,在 URL 中输入“/”仍然有效。

    read -r -p "Web Address: " url
    if [ "${url:0:4}" == "http" ] || [ "${url:0:5}" == "https" ]
    then
        lynx $url -accept_all_cookies
    else
        $url="http://$url"
        lynx $url -accept_all_cookies
    fi

鉴于此的性质,我想确保我们有一个防弹解决方案,因为这是一台生产机器。有什么方法可以在 100% 的时间内可靠地清理用户输入以防止访问本地文件?

访问localhost和127.0.0.1都可以;不必要,但所做的只是调出 Apache 成功安装页面。

我的想法是:

这有点困难,因为当输入“/”时,Lynx 似乎将其重定向到 URL,whine,然后将其重定向到本地 URL:

Web Address: /
/home/com/file.sh: line 109: /=http:///: No such file or directory
                                                           / directory (p1 of 2)
Current directory is /

然后它转出我的根目录列表。

但是,我意识到这还不够。用户仍然可以键入目录中本地文件的名称。我在调用此脚本的目录中输入 shell 脚本的名称,Lynx 吐出 bash 脚本的内容。

最重要的是,我在 Lynx 中有 "go to" 选项,一旦页面 已经 被加载,我不用担心!我可以像 lynx $url -goto 那样禁用它,但如果我可以避免它,我宁愿不这样做。

禁用 Web 实用程序不是一个选项,所以有没有办法再次确保它安全?

例如,如果您传递 /home˜/file://,Lynx 将列出您的主目录。但是如果你传递home,Lynx会把它改写成www.home.com。所以:

  1. 删除前导 /˜/file://,如果需要(如果存在)

但让我们考虑一下,您在调用 Lynx 的同一目录中有一个名为 home 的文件;它会显示你的文件。所以:

  1. 如果需要(如果不存在)
  2. 前置 http(s)://

事实上,您可以通过对所有 URL 加强前缀 http:// 来解决所有问题,如 http://file:/ / 或 http://~/ 没有意义。

请看how Lynx handles various types of URL and URL_DOMAIN_PREFIXES/SUFFIXES

经过更多测试,我得出了以下解决方案,

它并不漂亮,但它确实可以在不减少功能的情况下工作:

read -r -p "Web Address: " url
if [ "$url" == "" ]
then
    lynx "https://analogfiles.ml" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:1}" == "/" ] || [ "${url:0:1}" == "~" ] || [ "${url:0:7}" == "file://" ]
then
    lynx "~http" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:7}" == "http://" ] || [ "${url:0:8}" == "https://" ]
then
    lynx $url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
else
    lynx "http://"$url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
fi

第一部分处理主页(我已将其设置为多个 Lynx-friendly 站点之一)。由于我的限制,按 ENTER 键不再导致主页正常工作。

第二部分阻止 Lynx 甚至接收到可以被视为本地的 URL。这是因为 即使通过标志 启用了限制,Lynx 也不会 使它们对给定的 URL 生效!这意味着如果 Lynx 收到机器本地的 URL,例如 file://home/,它将允许它,即使被标志禁用。我创建了一个名为 http 的错误消息文件,但用户只会看到一条 FTP 错误消息,这对我来说没问题。

否则,如果 URL 缺少 http:// 或 https://,我将添加 http://。

可以通过键入 lynx -restrictions 查看您在此处看到的限制,其中提供了更多信息。

您看到的最相关的限制是 dired_support,它不允许导航到本地文件(其他限制不直接相关,但我认为没有理由允许它们,所以为了安全起见我不允许它们)。这意味着我可以继续允许使用 GoTo,而不用担心可以通过这种方式访问​​本地文件,绕过我在这里使用的 if-else 检查。事实上,if/else 检查只是必要的,因为 Lynx 未能正确应用从 shell 脚本访问的第一个 URL 的限制。

换句话说,我必须手动阻止使用我的 if-else 语句访问本地文件,然后相信 Lynx 会禁止访问其上的本地文件。