好的,首先第二个问题:
为什么区分大小写会带来安全风险?
区分大小写本身并不是安全风险。根据另一个答案中的评论,问题似乎是它可能绕过具有特定名称/大小写的目录的安全约束,特别是WEB-INF
(可能包含敏感代码或配置文件)。
如果您尝试访问 domain.com/WEB-INF Tomcat 会阻止它,而它会将 domain.com/Web-Inf 视为不同,并且可能不会阻止它(我还没有实际测试过是否是这种情况) .
然而,这并不是一个真正的问题,因为 Railo 不要求您在 webroot 中拥有 WEB-INF 目录 - 您可以将 Railo 配置为指向不同的位置,如果该位置在 webroot 之外,那么问题就被消除了。
(免责声明:这是基于可用信息;可能不止于此,但您有责任对任何可公开访问的网站执行安全扫描/渗透测试。)
如何解决区分大小写的问题?
这里有很多选择...
考虑另一个 servlet 引擎而不是 Tomcat,例如 Jetty。
虽然同样适用于 Jetty 和 Tomcat,但 Jetty 的aliases
选项 (in {jetty}/etc/webdefault.xml
) 并未被弃用(就像 Tomcat 的区分大小写的开关一样),并且在简短的测试中,它似乎阻止了对所有大小写变体的访问web-inf
。
很可能还有其他 servlet 引擎具有可以接受的类似选项(例如 Resin
将 Railo 与 Tomcat 一起使用时,无需删除 Web 服务器。
虽然您可以使用 Tomcat 的 Coyote Web 服务器,但您不需要这样做,并且将(例如)Apache httpd、Nginx 或 IIS7 放在前面可以为您提供更大的灵活性 - 特别是它允许您使静态资源不区分大小写。
我这样说是因为你给出的例子是一个图像文件,所以它不需要去 servlet 引擎或 Railo - 如果它只是静态文件是问题(如果所有请求都通过 index.cfm 则完全有可能)然后简单地将 Web 服务器配置为不区分大小写是解决此问题的简单方法,而无需 Tomcat/Railo。
修复文件使用一致的大小写,使用 URL 重写来重定向请求。
例如,在记录 404 错误时爬取您的站点 - 这将为您提供大小写不匹配的列表。
一旦你有了这个,创建一个简单的脚本将所有这些文件重命名为小写,并生成一系列重写规则,以便将请求的文件重定向到小写变体。
例如使用 mod_rewrite 语法:
# If file exists, don't rewrite it (and stop processing further rules)
RewriteCond ${REQUEST_URI} !f
RewriteRule .* - [L]
# Requested file doesn't exist, so redirect to lowercase version
RewriteRule (?i)img/employee/greg.jpg img/employee/greg.jpg [L,R=301]
RewriteRule (?i)img/employee/bert.jpg img/employee/bert.jpg [L,R=301]
RewriteRule (?i)whatever.else whatever.else [L,R=301]
第一条规则确保不需要检查存在的文件(L 标志表示停止寻找进一步的重定向),而 (?i) 将执行不区分大小写的匹配并执行 301 重定向到正确的文件。
这解决了眼前的问题,随着时间的推移,您可以逐渐更新代码以使用一致的情况,直到不再需要重定向。
重写语法取决于您用于 Web 服务器的内容 - 所有这些都有选项,但有些比其他更成熟/集成。