Tomcat和Railo在迁移时需要不区分大小写

Tomcat和Railo在迁移时需要不区分大小写,tomcat,tomcat7,case-sensitive,railo,Tomcat,Tomcat7,Case Sensitive,Railo,我正在将几个大型站点从ColdFusion、MS SQL和IIS迁移到Railo、MySQL和Tomcat 7。设置还不错,但有很多旧代码,我将重新编写,因为案例并不总是被考虑在内 虽然我不知道为什么区分大小写会造成如此大的安全威胁(来自MS world,这从来都不是问题),但我需要找到一种方法,让Tomcat 7和Railo在img/employee/greg.jpg文件夹中找到img/employee/greg.jpg。employee中的E导致半数呼叫失败 两个问题: 如何使其不区分大小写

我正在将几个大型站点从ColdFusion、MS SQL和IIS迁移到Railo、MySQL和Tomcat 7。设置还不错,但有很多旧代码,我将重新编写,因为案例并不总是被考虑在内

虽然我不知道为什么区分大小写会造成如此大的安全威胁(来自MS world,这从来都不是问题),但我需要找到一种方法,让Tomcat 7和Railo在
img/employee/greg.jpg
文件夹中找到
img/employee/greg.jpg
。employee中的
E
导致半数呼叫失败

两个问题:

如何使其不区分大小写?为什么区分大小写会带来安全风险?

在railo\etc\webdefault.xml文件中,将别名更改为true。这使您的应用程序不区分大小写

<init-param>
  <param-name>aliases</param-name>
  <param-value>true</param-value>
</init-param>

别名
真的

至于为什么案例不敏感是一种安全风险,我想说在这种情况下它不是。如果您存储了密码,并且密码不区分大小写,这将是一个问题(除了没有对密码进行散列之外),但我不明白为什么这会带来安全风险。

好的,那么首先是第二个问题:

为什么区分大小写会带来这样的安全风险? 区分大小写本身不是安全风险。根据另一个答案中的评论,问题似乎是它可能绕过具有特定名称/大小写的目录的安全约束,特别是
WEB-INF
,(可能包含敏感代码或配置文件)

如果您试图访问domain.com/WEB-INF,Tomcat会阻止它,而它会将domain.com/WEB-INF视为不同的,并且可能不会阻止它(我还没有实际测试过这种情况)

但是,这并不是一个真正的问题,因为Railo不要求您在webroot中拥有WEB-INF目录-您可以,如果该目录在webroot之外,则该问题将被删除

(免责声明:这是基于可用信息;可能不止这些,但您有责任对任何可公开访问的网站执行安全扫描/渗透测试。)


如何解决区分大小写的问题? 这里有很多选择

考虑另一个servlet引擎而不是Tomcat,例如JETTY。 虽然Jetty和Tomcat的情况相同,但Jetty的
别名
选项(在
{Jetty}/etc/webdefault.xml
中)并没有遭到反对(就像Tomcat的区分大小写开关一样),在简单的测试中,它似乎可以阻止对
web inf
的所有大小写变体的访问

很可能还有其他servlet引擎具有可接受使用的类似选项(例如树脂)

将Railo与Tomcat一起使用时,不需要删除web服务器。 虽然您可以使用Tomcat的Coyote web服务器,但不需要这样做,而且(例如)将Apache httpd、Nginx或IIS7放在前面可以给您带来更大的灵活性,特别是它允许您使静态资源不区分大小写

我之所以这样说,是因为您给出的示例是一个图像文件,所以它不需要转到servlet引擎或Railo—如果问题只在于静态文件(如果所有请求都通过index.cfm,则完全可能)然后简单地将web服务器配置为不区分大小写是解决这个问题的一个简单方法,而不必考虑Tomcat/Railo

修复文件使用一致的情况,使用URL重写重定向请求。 例如,在记录404错误时对您的站点进行爬行-这将为您提供案例不匹配的列表

一旦你有了这个,创建一个简单的脚本,将所有这些文件重命名为小写,并生成一系列重写规则,以便将请求的文件重定向到小写变量

例如,使用mod_重写语法:

# 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服务器使用的不同而不同-所有选项都有,但有些选项比其他选项更成熟/集成。

谢谢Matt,我找不到webdefault.xml文件。因此我搜索了别名,什么都没有。在railo目录的xml文件中搜索了init参数,但找不到他说得对。也许我是一个wuss,但IIS更容易使用
/etc/webdefault。Jetty使用的是xml
。对于Tomcat来说,它是
/conf/web.xml
,要讨论潜在的安全问题,请参阅-不幸的是,似乎没有太多关于实际问题的细节。/显然,所有这些都有效B在v7旧版更改之前-调用器servlet最终被删除-线程执行器的独占使用-以前的Jakarta标记库成为Tomcat的一部分-StandardContext上的区分大小写选项被删除-已弃用。此选项将在Tomcat 7以后的版本中删除,默认值始终为true。听起来像我被搞砸了,我必须通过大量的代码修复链接或刮railo,因为它不能与IIS一起工作。我知道的主要安全问题必须与受保护和区分大小写的WEB-INF目录有关。如果不区分大小写,该目录不受JEE服务器中的安全措施保护,可能会导致源代码丢失-代码发布。