1

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

虽然我不确定为什么区分大小写是一种安全威胁(来自 MS 世界,这从来都不是问题),但我需要找到一种方法让 Tomcat 7 和 Railo在文件夹中找到img/employee/greg.jpg它。img/Employee/greg.jpg内部E员工导致一半的呼叫失败。

两个问题:
我怎样才能让它不区分大小写以及为什么区分大小写会带来安全风险?

4

2 回答 2

3

好的,首先第二个问题:

为什么区分大小写会带来安全风险?

区分大小写本身并不是安全风险。根据另一个答案中的评论,问题似乎是它可能绕过具有特定名称/大小写的目录的安全约束,特别是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 服务器的内容 - 所有这些都有选项,但有些比其他更成熟/集成。

于 2012-09-23T15:41:58.197 回答
0

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

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

至于为什么不区分大小写是一种安全风险 - 我会说在这种情况下它不是。如果您存储了密码并且它们不区分大小写,那将是一个问题(除了它们没有被散列),但我不明白为什么这会带来安全风险。

于 2012-09-22T00:28:51.863 回答