我有一个前端控制器index.php
,所有请求都通过它来定向。我想基于URI从平面文件加载内容。例如,对/
的请求将尝试从文件系统中读取../content/index.md
,并从/whacky/waving
读取../content/whacky/waving/index.md
。
我是否需要清理传入的$_SERVER['REQUEST_URI']
攻击?用户是否可以请求http://domain.com/../../../../etc/groups,例如?
我的第一个想法是剥离任何不是0-9a-z\-\/_
的东西,但是对于开发我正在运行内置的PHP服务器,这需要我用点来捕获静态资产。
我正在使用PHP realpath()
函数取得进展,因为它解决了/../
之类的问题 - 我检查了输出以确保它在Web根目录中以确保安全。当然,它不适用于不存在的文件。
编辑:我不相信这是Sanitizing strings to make them URL and filename safe?的副本,因为它没有讨论在文件系统上使用用户提供的URI可能带来的安全隐患。它专注于字符集和生成新文件的slug (可以符合作者想要的任何约束),而不是安全地将URL清理为有效的文件系统路径。我认为差异值得提出一个新问题。