【问题标题】:Stop redirecting page if the url have control character如果 url 有控制字符,则停止重定向页面
【发布时间】:2022-04-27 00:19:38
【问题描述】:

我想检查 URL 是否有控制字符代码,例如 0x00,0x01..0x1f 和 0x7f

example.com/test.php?status0x01Http../

如果需要重定向到404页面。如果不存在该字符,则重定向到被访问的页面。

我想在.htaccess 中实现这一目标。 试过了

RewriteRule ^/?(.*)>$ /$1 [L,R=301]

以上代码删除所有字符

【问题讨论】:

  • 你尝试了什么,遇到了什么问题?
  • RewriteRule 仅将模式应用于 URL 的路径组件。如果你想根据查询字符串内容做任何事情,你需要使用 RewriteCond 来做到这一点。
  • "上面的代码删除所有字符" - 上面的代码不会那样做。 sample.com/test.php?status0x01Http../ - 大概是 0x01 你的意思是十六进制代码 01 的序数字符,所以 URL 不包含示例中所述的字符?

标签: apache .htaccess redirect mod-rewrite query-string


【解决方案1】:

使用您显示的示例和尝试,请尝试遵循 htaccess 规则文件。我在这里发布了 2 组 htaccess 文件,只保留其中一个,而不是两个。

第一个是一个通用的,在任何具有 .php 后跟查询字符串的 url 上它都可以工作。

RewriteEngine ON
RewriteCond %{THE_REQUEST} \s(?:[^.]*)\.php\?.*%([01][0-9A-F]|7F) [NC]
RewriteRule ^ - [R=404,L]

第二个是一个特定的案例,它适用于包含 test.php 后跟一个查询字符串的 URL。

RewriteEngine ON
RewriteCond %{THE_REQUEST} \s/test\.php\?.*%([01][0-9A-F]|7F) [NC]
RewriteRule ^ - [R=404,L]

请确保在测试您的 URL 之前清除您的浏览器缓存。

同时将这些规则放在您的 htaccess 规则文件的顶部。

【讨论】:

    【解决方案2】:

    从您的示例中,这些 控制字符 仅出现在查询字符串中。要形成有效的 HTTP 请求,这些字符需要在请求中进行 URL 编码(即 % 编码为 %HH)。所以一个实际的请求应该是这样的:

    example.com/test.php?status%01Http../
    

    我们可以使用 mod_rewrite 条件检查 QUERY_STRING 服务器变量,该条件保持 %-encoded。

    例如,您可以使用以下方法为此类 URL 触发 404:

    RewriteCond %{QUERY_STRING} %([01][0-9A-F]|7F) [NC]
    RewriteRule ^ - [R=404]
    

    这需要靠近您的 .htaccess 文件的顶部,在任何现有的 mod_rewrite 指令之前。作为一般规则,任何 blocking 指令都应该放在第一位。

    如果不存在这样的字符,则重定向到访问的页面

    在这方面不需要做任何事情,上面的规则根本没有被触发,请求失败并正常处理。


    更新:

    example.com/test.php?status0x01Http../
    

    虽然看起来(从最近的问题中)您可能指的是文字字符 0x01 等。这些不是 URL 中的“控制字符”,它们只是字符序列 0、@ 987654329@、01。等等

    如果是这种情况,那么您可以将上述规则修改为:

    # Check the query string only for this sequence of chars
    RewriteCond %{QUERY_STRING} 0x([01][0-9A-F]|7F) [NC]
    RewriteRule ^ - [R=404]
    

    如果此字符序列也出现在 URL 路径中,那么您无需执行任何操作,因为我希望您的应用程序在 URL 无法解析时已经触发 404。但是,您可以通过检查 THE_REQUEST 来检查 URL 中任何位置的字符序列。

    例如:

    # Check the entire URL for this sequence of chars
    RewriteCond %{THE_REQUEST} 0x([01][0-9A-F]|7F) [NC]
    RewriteRule ^ - [R=404]
    

    【讨论】:

    • 这只是在查询字符串中检查
    • @user3386779 是的,这仅根据您问题中的示例检查查询字符串。如果有更多信息,请编辑您的问题以包含此信息。您收到的实际 URL 是什么?如果您确实在 URL 中看到 0x01(根据您的示例),那么这不是“控制字符” - 我在对您的问题的评论中解决了这个问题,但没有收到任何回复?
    • @user3386779 我已经更新了关于匹配字符序列0x01 等(而不是“控制字符”本身)的答案。我还介绍了在 URL 中的任何位置匹配这些字符,而不仅仅是在查询字符串中。
    猜你喜欢
    • 2012-10-05
    • 2013-07-18
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多