使用mod_rewrite隐藏所有PHP扩展(包括子目录)


Using mod_rewrite to hide all PHP extensions (incl. subdirectories)

我正试图使用mod_rewrite将php扩展隐藏在一个网站的url末尾。该网站有以下内容:

/index.php
/news.php
/about/index.php
/about/contact.php

我希望以下工作:

http://domain.com/news
http://domain.com/about
http://domain.com/about/contact

现在我正在使用下面的重写,但它不适用于子目录

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME}'.php -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php

TIA。

序言

首先,这篇文章是为了回答人们提出的问题。为了你的利益,为了其他认为"模糊安全"毫无意义的人的利益,我还包括了一些更多的安全考虑因素(如果这是真的,就没有必要模糊密码…)我为所有抨击这个问题的人感到难过,更为重要的是,为了你的雇主,我建议你花更多的时间学习如何保护网站。OWASP网站是一个很好的资源(https://www.owasp.org)。

如果您对此有疑问,或想了解更多有关安全的信息,请参阅下面的安全注意事项

解决方案

我发现的最好的解决方案是让服务器端技术特定的文件看起来不存在。例如,当黑客在.php文件上重定向,在.jsp文件上重定向404时,您显然在使用php。您需要做的是使对.php的请求看起来与对.jsp、.cfn等的请求相同。

这可以通过使用您的网站欢迎文件和目录轻松完成。例如:

您需要设置您的网站目录,如:

  • /index.php
  • /news/index.php
  • /关于/index.php
  • /关于/contact/index.php

此外,在您的apache配置文件(或.htaccess)中,您为站点设置了DirectoryIndex

DirectoryIndex index.php

一旦你完成了设置,每个都可以通过以下方式访问(这些也可以使用尾部斜杠):

http://www.yoursite.com/
http://www.yoursite.com/news
http://www.yoursite.com/about
http://www.yoursite.com/about/contact

现在已经完成了,您可以设置这个驱魔的全部要点:隐藏您正在使用PHP的事实。你只需要隐藏你正在使用PHP的事实,这只需让index.PHP的行为与你网站上的index.cfm、index.py、index.jsp等相同即可:返回404,因为它们不存在。。。重写块看起来像:

RewriteEngine On
RewriteCond %{REQUEST_URI} '.(php)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ default [R=404,L]

显然,这可以通过其他服务器端技术来实现,如ColdFusion、Python、Java、ASP.NET(天堂禁止你使用Apache2而不是IIS;)等

其他注意事项

显然,一个安全的网站使用了一种全面的方法,有很多方面。请不要把这篇帖子看作是说你所需要做的保护你的网站的一切就是混淆你正在使用的技术。显然,隐藏你正在使用的技术并不能解决给定技术中的安全问题。这篇文章只是声称这是一个很好的工具添加到集合中。您需要在应用程序/解决方案的每一层应用其他安全层,才能拥有一个真正安全的站点。

诚然,混淆技术不会愚弄最优秀的黑客和机器人。最好保持"如果可以访问,就可以被黑客入侵。就这样。"的心态。唯一真正安全的解决方案是切断与服务器的连接。黑客和开发者之间的斗争是永无止境的。这也是一场战斗。你可以把它比作孙子的"兵法"。一个运作良好的网站在安全方面对你不利。

关键是,黑客可以利用任何信息来利用你,他/她会的。因此,了解用于渲染页面的服务器端技术对黑客来说非常有用,他们可以利用特定技术中的弱点。这意味着隐藏扩展有一个非常有效的目的,让黑客猜测。黑客不必只关注一项技术,而是必须猜测正在使用哪项技术,然后才能利用任何特定技术的弱点。底线是:黑客知道的越少越好。

响应标头

许多服务器端技术都会有特定的头响应信息与之关联,例如标识会话ID的cookie(如Java中的JSESSIONID)。在混淆文件扩展名之后,您需要考虑将用于会话和其他参数的头变量重命名为您的应用程序独有的变量。如果不清理响应标头,隐藏您正在使用的扩展名是毫无意义的。

XSS和SQL注入

数据库驱动的应用程序面临的更大威胁是跨站点脚本(XSS),更糟糕的是SQL注入。如果你想保护你的网站,我也会花一些时间来寻找解决方案。还要研究网络级别的资源注入(例如伪造DNS条目,使网站看起来像是在你的域上)。

祝你好运!!

尝试此解决方案:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

http://www.interactivetools.com/docs/cmsbuilder/file_extensions.html

隐藏php扩展是没有用的
这样的事情毫无意义。

如果你想要"可读"或"seo-friendly"的url,我不会提供太多帮助
在任何其他情况下,它都将是无用的。

不要为每个页面都有单独的PHP脚本,而是尝试了解更多信息并实现某种内容管理系统,通过从数据库中检索实际内容,只使用一个PHP脚本来显示两个相同类型的页面。

如果存在,只需删除末尾的斜杠。这意味着复制粘贴你的规则(=有斜线和没有斜线(没有找到其他方法)):

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# if there's a slash, remove it:
RewriteRule ^(.*)/$ $1.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) $1.php [QSA,L]
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME}'.php -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php