【问题标题】:Why does this htaccess regex fail with 3 or more periods?为什么这个 htaccess 正则表达式会以 3 个或更多句点失败?
【发布时间】:2018-10-30 06:31:17
【问题描述】:

为什么这个 RegEx 会失败?

目标是重写:

http://example.com/Almost-Anything-Here/381 --> /lv.php?id=381&%{QUERY_STRING}

请注意,我忽略了 URL 中的文本,只是尝试获取数字(在本例中为 381),我将其传递给 lv.php

规则如下:

RewriteRule ^[/]?[A-Za-z0-9\-_(\.)*]+/([0-9]+)$ /lv.php?id=$1&%{QUERY_STRING} [L]

如果有 0、1 或 2 个句点,但它会在 3 个或更多句点内失败(使用 HTTP 500)。为什么?!我尝试了几种在正则表达式中转义/捕获句点的方法,但没有运气。

示例测试网址:

  • 作品:http://example.com/Great/381
  • 作品:http://example.com/Great./381
  • 作品:http://example.com/Great../381
  • 失败:http://example.com/Great.../381

UPDATE 这是来自服务器日志的错误消息,显然是正则表达式问题,仍然不知道为什么......

Access denied with code 500. Pattern match "\\\\.\\\\.\\\\./" at REQUEST_URI. [msg "Bogus Path denied"] [hostname "www.example.com"] [uri "/Great.../381"]

【问题讨论】:

  • 你能检查一下 HTTP 500 的日志吗?
  • 谢谢@Thefourthbird,这提供了一个巨大的线索......
  • 不确定是否有帮助,但我认为您不必在字符类中转义点 \.
  • 使用xampp没问题,你的htaccess中有RewriteBase /
  • 如果你改用RewriteRule ^.*/([0-9]+)/?$ /lv.php?id=$1 [QSA,L]会怎样?

标签: regex apache .htaccess


【解决方案1】:

我很确定您的 Apache Web 服务器已安装 ModSecurity 并包含如下安全配置:

#generic bogus path sigs
SecRule REQUEST_URI "\.\.\./" "id:300006,rev:1,severity:2,msg:'Bogus Path denied'"

有一些ways to turn it off,但通常,mod_security 的实现是有原因的。

【讨论】:

  • 据我所知,这是 ModSecurity 2.x 中的默认规则之一。但是,我在 3.x 的规则中找不到它 - 但也许我看错了位置。
  • 感谢您的回复,看来这很可能是罪魁祸首!这就引出了一个问题,为什么 mod_security 中有这条规则,我需要保留它吗?我可以从 mod_security 配置中杀死它吗?
  • @Eric 我无法在这里给出明确的答案,但可以说 SecRule 与其说是真正的安全保护,不如说是一种健全性检查。可能值得在 webmasters.stackexchange.com 或 security.stackexchange.com 上询问
  • @Eric 可以说,如果这条规则妨碍了你,应该删除它。我在这里发现了一个事件,该规则阻止了 vbulletion 用户:vbulletin.com/forum/forum/vbulletin-4/…,这是对该规则的描述及其基本原理:wiki.atomicorp.com/wiki/index.php/WAF_340008There is no such valid path in any operating system
  • 感谢您的帮助和研究!最好接受你的回答。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多