我刚刚从生产中运行的应用程序收到Sentry的警报,该警报似乎是由恶意请求引起的。
我已经设法在我的本地env:中重新创建了错误
(Plug.Router.MalformedURIError) malformed URI "/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/bin/sh"
(elixir 1.12.1) lib/uri.ex:419: URI.decode/1
(elixir 1.12.1) lib/enum.ex:1553: Enum."-map/2-lists^map/1-0-"/2
(elixir 1.12.1) lib/enum.ex:1553: Enum."-map/2-lists^map/1-0-"/2
(plug 1.12.1) lib/plug/router/utils.ex:18: Plug.Router.Utils.decode_path_info!/1
(matchhaus 0.0.1) lib/plug/router.ex:268: MyApp.Cors.match/2
...continues
可以看出,请求中的URL路径是/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/bin/sh
。这看起来像是对URI字符串进行双重编码以遍历目录结构(%%32%65%%32%65
->%2e%2e
->..
(。然而,这似乎在URI.decode
阶段失败了,这是有道理的,因为像%%32
这样的东西是无效的。
我的问题是,我宁愿我的服务器不要因为这样的事情而抛出错误。理想情况下,它只会处理这个问题,并以404或400(或其他4xx状态(响应,因为这是一个无效的请求。
这是Plug
应该处理的问题吗?还是这是我应该在Phoenix应用程序中处理的问题?
正如您在异常定义中看到的,它将发送HTTP 400响应(:plug_status
字段对此进行了定义(。唯一可以成为";有问题的";有日志消息。问题是这是否真的是你的问题。如果是,那么您可以捕获所有/cgi-bin/
路径,并在到达路由器之前忽略这些请求。