为了测试路径遍历攻击防护,我准备了SecredFile.png文件。因为不在public目录下,所以正常情况下无法访问。
现在尝试通过 REST 客户端访问此文件(Chrome 删除了
../
):
如果检查
url
(HTTP.IncomingMessage类型)的
request
属性,它将是/SecretFile.png
。是否存在路径遍历攻击保护,URI 已更改,这至少令人困惑,因此可能是错误的原因。
这样的行为好吗?
如果我们将 URL 变得更复杂(如
http://127.0.0.1/test/../../SecretFile.png
),也会得到相同的结果 - request.url
将是 /SecretFile.png
开发后端框架应该做什么?
相关的子问题是,如果
http://127.0.0.1/../SecretFile.png
或http://127.0.0.1/test/../../SecretFile.png
的路径遍历攻击是不可能的,作为框架开发者我必须提供哪些路径遍历攻击防护措施?
浏览器和其他 HTTP 客户端在将路径发送到服务器之前
会解释路径中的
..
和
.
组件,因此当路径到达服务器时,这不再是问题。
然而,写一些能做到这一点的东西是微不足道的。只需打开一个终端,运行 telnet 127.0.0.1 80
并输入:
GET /../SecretFile.jpg HTTP/1.0
Host: 127.0.0.0
(以空行结束以完成请求)某些漏洞(例如本例中的路径遍历)只能通过做 HTTP 客户端不会做的事情来利用。