2

我的 .htaccess 中有一个重写规则,它允许我添加由 / 分隔的无限参数。

RewriteRule ^(.*)/?$ index.php?params=$1 [L,NC]

这可以正常工作,直到我向它发送一个带有编码 \n 的 urlencoded 字符串(使用 cURL)(%0A)。

所以server/param1/param2/param3text有效,但server/param1/param2/param3text1%0Aparam3text2没有。

我在 Stack Overflow 上发现一个 Q 提到了类似的问题:

如何将 htaccess 重写规则应用于包含换行符 (%0A) 的 URL?

但我不能/不知道如何[\r\n]我的(.*).

有什么帮助吗?

4

3 回答 3

1

好的,首先,我必须添加一个检查以确保该文件不存在(两个 RewriteCond 负责处理)。然后我必须创建一个匹配任何字符的模式,或者匹配一次或多次的 a\r或 a ( )。零次或多次运算符 ( ) 未正确返回结果。 \n+*

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((.|\r|\n)+)/? index.php?params=$1 [L,NC]
于 2013-08-12T14:40:50.463 回答
0

您必须利用%{THE_REQUEST}变量从原始 Apache Web 服务器请求中获取实际路径。

试试这个代码:

RewriteCond %{QUERY_STRING} !^params=.+ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+[^/]+/([^\s]+) [NC]
RewriteRule ^ index.php?params=%1 [L,QSA]

然后在里面index.php检查$_SERVER["QUERY_STRING"]完整的纯路径%0A

于 2013-08-12T19:28:53.370 回答
0

仅供参考:一种称为空白过滤的常见黑客方法使用 %0A

通过使用替代空白字符代替空格字符 (%20),可以绕过空格字符的过滤。大多数 SQL 引擎将换行符(在 *NIX 环境中为 %0a,在 Windows 环境中为 %0a%0d)、制表符或 + 字符视为有效空格:

于 2013-08-12T23:28:33.943 回答