我在重写规则(在IIS 8上)中使用正则表达式来拒绝对以点(。)开头的所有文件和文件夹的访问。 这样,无法访问这些Urls:
https://example.com/.forbidden_folder/somefile.txt
<rule name="Deny access to files and folders starting with . or /." patternSyntax="ECMAScript" enabled="true" stopProcessing="true">
<match url="(^\.|\/\.)" ignoreCase="true" negate="false" />
<action type="AbortRequest" />
</rule>
今天,我想添加一个排除项,以允许访问名为“ .specific_allowed_file”的特定文件和名为“ .specific_allowed_folder”的特定文件夹,例如:
我设法通过添加两个条件来实现它,就像这样:
<rule name="Deny access to files and folders starting with . or /." patternSyntax="ECMAScript" enabled="true" stopProcessing="true">
<match url="(^\.|\/\.)" ignoreCase="true" negate="false" />
<conditions logicalGrouping="MatchAny">
<add input="{PATH_INFO}" pattern="(.*)(\.specific_allowed_file$" negate="true" />
<add input="{PATH_INFO}" pattern="(.*)(\.specific_allowed_folder)(.*)" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
您知道这是否是可靠的实现,还是我应该使用其他方法,例如修改匹配的正则表达式?
非常感谢您,
答案 0 :(得分:1)
您的方法非常好,因为它允许用户使用可读和清晰的代码添加条件。应该注意一件事:pattern="(.*)(\.specific_allowed_folder)(.*)"
也将允许.specific_allowed_folder_WITH_MORE_TEXT_HERE
。您可以通过在第一组和第三组中添加/
并通过在各组之后放置一个?
量词来使其成为可选文件来修正它仅匹配文件夹的情况:
<add input="{PATH_INFO}" pattern="^(.*/)?(\.specific_allowed_folder)(/.*)?$" negate="true" />
如果您希望单个正则表达式完成全部工作,请使用负前瞻的正则表达式:
<match url="(^|/)\.(?!(specific_allowed_file|specific_allowed_folder)(/|$))" ignoreCase="true" negate="false" />
请参见regex demo。
详细信息
(^|/)
-字符串或/
\.
-一个点(?!(specific_allowed_file|specific_allowed_folder)(/|$))
-不会紧跟specific_allowed_file
或(|
)specific_allowed_folder
子字符串,其后跟/
或字符串结尾({{ 1}})。