我有一个 Rails 应用程序,当我收到一些包含大量垃圾字符的奇怪 URL 时,它会抛出异常。例如
https://example.com/pages/28-faq-common-questions-answered++++++++++++++++++++++++Result:+%ED%E5+%ED%E0%F8%EB%EE%F1%FC+%F4%EE%F0%EC%FB+%E4%EB%FF+%EE%F2%EF%F0%E0%E2%EA%E8
我绝对想摆脱这些 Rails 异常。这些查询永远不会由真正的用户生成。
我正在考虑在 Apache 中使用 RedirectMatch 并将这些类型的查询永久重定向到网站的主页。
问题 1:这是一个好主意吗?或者有更好的办法吗?
问题 2:如何创建规则以足够灵活地成功完成此操作,以便每次有新机器人访问我的网站时我不必编写许多规则?
我粗略地尝试了以下方法,但什么也没发生。它似乎根本不起作用。
RedirectMatch permanent /\+\+\+\+\+/g https://example.com
答案1
问题 1:这是一个好主意吗?或者有更好的办法吗?
问题 2:如何创建规则以足够灵活地成功完成此操作,以便每次有新机器人访问我的网站时我不必编写许多规则?
更好的解决办法是,这也恰好解决了问题 2,即修复你的应用程序这样当它受到无效请求时不会抛出异常。相反,它应该检查输入中任何必要的先决条件并优雅地退出如果输入有误,则记录任何相关详细信息并向用户显示友好的错误消息。
如果由于某种原因应用程序无法轻松修改以执行此操作,请考虑至少将其包装在一个外部容器中,该容器可以捕获异常、记录异常详细信息并向用户显示不包含异常详细信息的友好错误消息。这虽然不能解决根本问题,但至少可以防止堆栈跟踪给用户带来不便。
应用程序抛出异常并暴露堆栈信息的问题最近也在我们的姊妹网站上进行了讨论信息安全在问题中如果我的网站抛出堆栈信息我应该担心吗?。目前得票最高的答案(迄今为止)这个问题的开头是:
在生产环境(与开发环境相反)中,堆栈跟踪和错误消息应记录到文件中,而不是转储到屏幕上。这是因为攻击者可能会了解您的系统信息,从而帮助入侵您的系统。
如果您修复应用程序以这样的方式工作,那么您也根本不需要重定向规则。
答案2
你可以使用 mod_rewrite 来规则类型:
RewriteRule \+\+\+\+\+ [F]
然后,您将向客户端返回一个 Forbidden 错误代码,这将阻止服务器执行更多无用的代码(在无用请求的上下文中)。