阅读时间 8 分钟 (1562 字)

如何离线?Joomla! 的离线模式有多离线?

How off-line is Joomla!'s off-line mode?

Joomla! 的临时离线模式是一个非常有用的选项,可以在进行维护时暂时关闭您的网站——例如更新 Joomla! 核心或扩展——而且官方文档建议在您的网站被入侵时使用。然而,这真的是离线模式吗?您是否应该注意任何潜在的问题?

正如标题所暗示的,离线模式并不像您想象的那样完全离线。事实上,离线模式就像魔术师所做的那样,是一种魔术。当您的网站在底层正常运行时——组件运行,插件执行——Joomla! 在将页面发送到浏览器之前,执行一个魔术,将真实页面与离线系统模板交换。这就是为什么您可以在浏览器地址栏中输入 https://www.joomla.net.cn?tmpl=offline 并看到官方 Joomla! 网站看似离线,但实际上并非如此。让我们看看 Joomla! 如何执行这种魔术师的表演,以及其影响和一种在紧急情况下真正将您的网站离线的可行方法。

拆解魔术

Joomla! 实际上是一个 PHP 框架,其中预装了几个“应用程序”。您的网站的前端部分就是其中之一。每个应用程序都继承自抽象的 JApplication 类。对于前端应用程序,JApplication 的具体实现称为 JSite,可以在 includes/application.php 文件中找到。离线模式在该文件中的唯一参考是在 render() 方法中,您会看到一些有趣且令人不安的东西:Joomla! 在渲染模板之前会检查您是否已将网站设置为离线模式。如果您的网站处于离线状态并且正在尝试服务 HTML 页面,且没有用户以管理员身份登录,Joomla! 将加载 offline.php 模板文件而不是常规的 index.php。

好的,请稍等。render() 方法何时被调用?答案是位于您网站根目录中的 main index.php 文件中。对 $mainframe->render() 的调用($mainframe 是一个全局变量,包含 JSite 对象)是该文件中的倒数第二行。换句话说,Joomla! 将执行所有插件,运行组件,并在最终输出 HTML 页面到浏览器之前,仅处理离线模式。JSite::render() 方法还告诉我们,只有 HTML 模式会受到离线模式的影响。朋友们,这可能对您的网站产生寒蝉效应...

寒蝉效应

稍微思考一下,您何时以及为什么要使用离线模式。首先,当您正在构建一个网站,还不希望全世界看到它时。在这种情况下,离线模式是合适的,因为它只是隐藏了用户可查看的内容,不让随机网络访客看到。从这个意义上说,离线模式工作得很好。但这并不是唯一,甚至也不是最常用的案例。

还记得我在文章介绍中给出的链接吗?提到当您的网站被黑时应该做什么?官方文档是在被黑后立即使用离线模式。 大错特错!大多数被入侵的网站都是因为一个足智多谋的黑客在您的网站上找到了盲 SQL 注入漏洞或直接文件上传漏洞。

在 SQL 注入漏洞的情况下,黑客在其网站上某个 URL 上附加了他喜欢的 SQL 语句,直接对其网站数据库执行他的恶意命令。这种攻击的前提是,易受攻击的组件解析黑客发送给它的查询参数。猜猜看?即使在离线模式下,您仍然容易受到针对易受攻击组件的 SQL 注入攻击。为什么?因为组件会执行,但您只是看不到它的输出。 您处于离线状态,但仍被黑客攻击。双杀。

在直接文件上传的情况下,黑客将一个 C99 变种的“root”脚本上传到您网站上的某个位置,利用一个易受攻击的组件。root 脚本在 Joomla! 之外执行,因此即使您将网站关闭,黑客仍然可以使用它。假设您想聪明一点,找到那个脚本并将其删除。哈哈!您打败了黑客...没有。当黑客发现他的脚本不见了,他可以再次尝试直接上传。由于易受攻击的组件仍在执行,尽管不可见,他仍然可以上传 root 脚本并完全控制您的网站。黑客得两分,网站所有者感到绝望。

总之: 离线模式不能也不能保护您免受黑客的攻击

我的功夫比你的强

您现在应该知道了。对于挡在我道路上的每一个问题,我都会找到解决方案,记录下来并与世界分享。只要您运行 Apache 或任何支持 .htaccess 文件和 mod_rewrite 的服务器,就可以完全关闭网站。这意味着它几乎可以在所有服务器上运行,除了大多数 IIS 安装。我们的想法是,我们只想自己能够访问网站,向其他访客和黑客显示静态 HTML 页面,从而有效地在他们自己的游戏中战胜他们。

你需要的第一件事是公网IP地址,即互联网连接使用的IP。这通常可以在路由器的连接信息页面上找到,格式为123.123.123.123,即由点分隔的四个数字。如果你不知道,只需访问 www.WhatsMyIP.org。你的IP地址在页面顶部以巨大的字体大小显示。记下来。在这个例子中,我将使用虚构的IP地址123.123.123.123。你还需要一个HTML文件以向访客展示,因为我们不再使用Joomla!的离线消息。你可以使用任何具备能力的工具创建一个,例如 Kompozer。如果你想,可以使用CSS和图片。我将假设你已经创建了一个名为offline.html的文件,并将其放置在你的网站根目录中。

接下来,你将创建一个包含以下内容的纯文本文件,并将其上传到你的网站根目录作为 .htaccess,覆盖旧的 .htaccess 文件

RewriteEngine On
RewriteBase /$rewrite_base
RewriteCond %{REMOTE_HOST} !123\.123\.123\.123
RewriteCond %{REQUEST_URI} !offline\.html
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.swf|\.css|\.js)$
RewriteRule (.*) offline.html [R=307,L]

如你所见,在这个文件中需要更改三件事

  1. 123\.123\.123\.123 是你的IP地址。你所要做的就是将点“转义”为反斜杠点。不要忘记在IP地址前加上感叹号。
  2. offline\.html 是你的HTML文件名,点“转义”为反斜杠点。
  3. offline.html 是你的HTML文件名。在这个最后的实例中不要转义点!

注意:如果你的网站在上传文件后出现空白页面或内部服务器错误500,请将R=307替换为R(不带=307部分)。这仅在Apache 2.0和1.3主机上需要,因为这些旧版本不支持这些重定向规则中的R=307“标志”。

一旦应用此文件,以下将发生。如果来自任何IP地址的请求(除了你自己的),访客将被重定向到offline.html页面,并带有临时重定向HTTP状态代码(这就是R=307的作用,并且它在那里以防止搜索引擎在你面对离线站点时恐慌)。然而,PNG、JPG、GIF、BMP、SWF、CSS和JS文件仍然会被提供服务,这样你就可以在offline.html文件中使用这些媒体类型而不会出现任何问题。

你可以非常容易地测试它。当你尝试连接到你的网站时,你应该看不到任何区别。如果你使用连接到不同路由器的设备(例如,连接到其3G连接的移动设备)连接到互联网,你应该看到offline.html页面的内容。你赢了!你现在可以修复被黑网站,而不用担心黑客在你工作时撤销你的修复。

Joomla!能被改进吗?

是的,也不是。首先,我提出的方法是对问题的简单解决方案,而不是真正的解决方案。它只适用于60%的主机——这是Apache服务器的市场份额。其余的40%无法使用此方法进行保护。所以,我不认为Joomla!没有在其核心中使用我的方法是有错的。它应该是一个通用的CMS,能够在几乎所有类型的服务器上运行。

然而,有一些事情可以做到。我们需要在index.php中移动和调整离线检查。如果网站处于离线模式,没有登录的超级管理员用户,并且请求与超级管理员尝试登录无关,不要运行应用程序。只需显示离线页面。在任何其他情况下(例如,在离线模式中,超级管理员已登录)只需运行应用程序。这将是最简单的修改,并且会对Joomla!的安全性产生神奇的效果。任何有兴趣“采用”这个想法并将其变成补丁的人吗?

在Joomla!社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能与Joomla!项目的官方立场不一致

0
在这里发表2011年2月的俳句
Joomla! 新手的优质资源
 

评论

已经注册? 登录这里
还没有发表评论。成为第一个发表评论的人

通过接受,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务