这个.htaccess规则做了什么?

时间:2018-04-02 21:00:17

标签: regex apache .htaccess mod-rewrite

我正在寻找方法来强化" WordPress安装和最近遇到的一些代码放在网站.htaccess文件中。但是,它没有解释它的作用,我试图解决它,但收效甚微。

代码/规则是:

RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ ///.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\=?(http|ftp|ssl|https):/.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\?.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(asp|ini|dll).*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(htpasswd|htaccess|aahtpasswd).*\ HTTP/ [NC]
RewriteRule .? - [F,NS,L]

我可以看到,当第一行中的任何页面被调用时,它会发挥作用,但除此之外,我会在黑暗中。

任何指针/解释都会非常感激。

P.S。如果有更好的地方发布,请告诉我,我很乐意移动它。

1 个答案:

答案 0 :(得分:1)

简而言之,所提到的规则通过阻止特定请求来提高安全性,如下所示:

RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]

从上一条规则开始,上面排除URI的行以/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/中的任何一个开头。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ ///.*\ HTTP/ [NC,OR]

上面的这一行是为了防止请求在URI的开头有两个以上的斜杠//,实际上这会阻止路径等效https://cwe.mitre.org/data/definitions/50.html

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\=?(http|ftp|ssl|https):/.*\ HTTP/ [NC,OR]

以上这一行是为了防止出现一种跨站点脚本(XSS),这里有一个示例http://cwe.mitre.org/data/definitions/79.html以下代码根据HTTP GET用户名参数在网页上显示欢迎消息:

$username = $_GET['username'];
echo '<div class="header"> Welcome, ' . $username . '</div>';

因为参数可以是任意的,所以可以修改页面的url,因此$ username包含脚本语法,例如:

http://trustedSite.example.com/welcome.php?username=<Script Language="Javascript">alert("You've been attacked!");</Script>

这会导致弹出无害的警报对话框。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\?.*\ HTTP/ [NC,OR]

上述行会阻止请求带有问号两次,例如??,因为在某些情况下,此漏洞可能会被网络浏览器利用,您可以在此处阅读更多内容https://www.securityfocus.com/bid/4876/exploit和此处{{ 3}}

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(asp|ini|dll).*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(htpasswd|htaccess|aahtpasswd).*\ HTTP/ [NC]

上述两行将阻止任何具有.dll.htaccess等扩展名的请求。

RewriteRule .? - [F,NS,L]

最后一行将导致服务器为所有捕获的请求返回403 Forbidden状态代码。