潜在的mod_rewrite与.htaccess中放置POST请求保护代码冲突(WordPress)

时间:2017-07-04 17:17:23

标签: wordpress apache .htaccess mod-rewrite post

为了增加安全性,我试图使用以下.htaccess代码阻止基于会员的WordPress站点上的非标准POST请求:

# Block non-standard POST requests
RewriteCond %{REQUEST_METHOD} POST [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-admin/ [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-cron.php [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-login.php [NC]
RewriteCond %{REQUEST_URI} !^.*/sign-in/ [NC]
RewriteRule ^(.*)$ - [F]

/登录/页面是"白名单"通过最后一个条件,因为它是指定的URL,所有POST请求在站点成员登录时发出:

enter image description here

我发现当代码放在默认的WordPress .htaccess代码中时,代码只能工作(即成功阻止所有未通过重写条件列入白名单的POST请求):

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# Block non-standard POST requests
RewriteCond %{REQUEST_METHOD} POST [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-admin/ [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-cron.php [NC]
RewriteCond %{REQUEST_URI} !^.*/wp-login.php [NC]
RewriteCond %{REQUEST_URI} !^.*/sign-in/ [NC]
RewriteRule ^(.*)$ - [F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

但是,如果POST阻止代码位于WordPress .htaccess代码的上方或下方,则/ sign-in / condition不起作用。如果代码放在上面 WordPress默认代码,则通过403阻止对/登录/页面的POST请求(尽管有趣的是,不阻止对/wp-login.php的POST请求)。如果代码放在下面 WordPress默认代码,则根本不会阻止任何内容。我被告知(由Restrict Content Pro,插件开发人员)登录过程检查$ _POST值,因此如果POST请求实际上没有被制作,它将无法工作(我最初的想法是不知何故,/ sign-in / URL没有被识别为POST请求。)

我还被告知这不是预期的行为,并且POST阻止代码应该正常工作,无论它放在.htaccess文件中的什么位置。有人建议可能会有一些独特的服务器配置导致此行为。但是,我已经在几个不同的Apache服务器/托管帐户(包括精简的WordPress安装)上测试了这个问题,并得到了相同的结果。

我想了解这种行为的原因。我想它可能与mod_rewrite以及如何处理RewriteRules和/或their flags有关,但我还没有能够提出我可以测试的任何具体想法。我还检查了错误日志,甚至尝试启用mod_rewrite logging,但据我所知,还没有找到任何有价值的东西。

0 个答案:

没有答案