【问题标题】:How to configure Yesod to only listen on localhost?如何将 Yesod 配置为仅在 localhost 上侦听?
【发布时间】:2021-01-25 09:25:45
【问题描述】:

我使用的是最小模板,只找到了更改端口的位置:

main :: IO ()
main = warp 3000 App

但我不知道在哪里设置其他任何东西。在App 中,路由生成发生了一些神奇的事情,但没有任何配置提示。

根据lsof -i Yesod 正在监听所有我不想要的接口。我只想将其限制为环回 (127.0.0.1)。


我想出了一个解决方法,可以在任何处理程序(路由)的顶部使用它来检查客户端的 IP 是否匹配:

onlyAllowedFromLocalhost :: Handler ()
onlyAllowedFromLocalhost = do
  let allowedIp = "127.0.0.1"
  host <- waiRequest <&> W.remoteHost <&> tshow
  unless (T.isPrefixOf (allowedIp <> ":") host) $
    sendResponseStatus forbidden403 ("Access is allowed only from " <> allowedIp)

有关正确的解决方案,请参阅snak的回答

【问题讨论】:

  • 我认为解决这个问题的标准方法是在反向代理(Nginx 或 Apache)后面运行 Yesod/Warp,然后让他们担心听什么。
  • @leftaroundabout 它并不意味着要在服务器上运行,因此添加其他东西进行配置并不实际。它也不能解决问题,因为 yesod 服务器仍将绑定到所有网络接口,因此仍然可以从 LAN(甚至互联网)访问它。 (最好在防火墙上解决这个问题,但我不能指望用户知道如何设置它,所以我希望应用程序在默认情况下尽可能安全。)

标签: haskell yesod


【解决方案1】:

您可以使用toWaiApp 将您的网站转换为Application,而不是使用warp,然后使用runSettings 运行它。现在,将Settings 配置为仅使用setHost 绑定一个环回并将其传递给runSettings

【讨论】:

  • 谢谢,这很好用。我希望它在文档中被提及。端口可以​​直接设置(甚至通过环境变量传递),但是主机由于某种原因不容易改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2018-01-12
  • 2021-02-09
  • 2017-05-24
  • 2020-07-06
  • 2021-08-09
相关资源
最近更新 更多