织梦怎么禁止直接访问模板文件

织梦模板文件位于 /templets/ 目录,是 .htm/.html 文件,本身不含可执行 PHP,但能被浏览器直接打开下载。这会导致模板结构、调用标签、JS 路径、自定义变量全部泄露,攻击者据此可精准构造注入与挂马。禁止直接访问模板文件是织梦加固中常被忽略却影响很大的一步。

一、模板文件直接访问的风险

  • 泄露站点目录结构与命名规则,便于攻击者定位敏感文件;
  • 暴露 {dede:global.cfg_xxx/} 调用的配置变量名,便于社会工程;
  • 暴露自定义 JS、CSS 路径,便于构造伪造页面或 XSS;
  • 被搜索引擎收录后形成大量重复内容,影响正常页面收录。

二、验证当前是否可被访问

直接访问以下 URL,若能下载到模板源码,说明存在风险:

https://www.example.com/templets/default/index.htm
https://www.example.com/templets/default/article_article.htm
https://www.example.com/templets/default/list_article.htm

三、Nginx 配置禁止访问

1. 整目录拦截

location ^~ /templets/ {
    deny all;
    return 404;
}

^~ 前缀表示匹配后不再走正则,是最稳的方式。返回 404 而非 403,避免暴露目录存在的事实。

2. 仅拦截模板扩展名

若模板被二次开发放在其他目录,可按扩展名拦截:

location ~* \.(htm|html|tpl|lbi)$ {
    if ($request_uri ~ ^/templets/) {
        return 404;
    }
}

3. 同时拦截模板缓存

location ^~ /data/tplcache/ {
    deny all;
    return 404;
}

四、Apache 配置禁止访问

1. 站点配置文件

<Directory "/var/www/html/templets">
    Require all denied
</Directory>

2. .htaccess 写在 templets 目录内

# /templets/.htaccess
<FilesMatch "\.(htm|html|tpl|lbi)$">
    Require all denied
</FilesMatch>

五、织梦程序层处理

1. 修改默认模板扩展名

部分站长会把 .htm 改为 .tpl.php,让模板在被直接访问时返回空白:

<?php if(!defined('DEDEINC')) exit('Forbidden'); ?>
<!-- 模板内容 -->

但这需要配合织梦模板引擎改造,不推荐新手操作。

2. 在模板顶部加防直接访问判断

<?php
if(!defined('DEDEINC')){
    header('HTTP/1.1 404 Not Found');
    exit('404');
}
?>

注意:仅当模板被作为 PHP 解析时此方法才生效,需配合服务器把 .htm 也交给 PHP 处理。

最稳妥的方案仍然是 nginx/apache 整目录拦截,不依赖模板改造,升级织梦也不会失效。

六、其他需要禁止访问的目录

除 templets 外,以下目录也应一并禁止外网访问:

location ^~ /data/        { deny all; return 404; }
location ^~ /include/    { deny all; return 404; }
location ^~ /install/    { deny all; return 404; }
location ^~ /member/templets/ { deny all; return 404; }
location ^~ /special/    { deny all; return 404; }

七、验证拦截效果

  1. 浏览器访问 /templets/default/index.htm,应返回 404;
  2. 访问 /templets/default/images/,确认模板内图片资源是否仍可加载(若前端引用了模板内图片,需要放行 .jpg/.png/.css/.js);
  3. 用 curl 验证:curl -I https://www.example.com/templets/default/index.htm
  4. 百度搜索 site:example.com templets,若有收录提交死链删除。

八、注意事项

  • 部分织梦模板把 CSS/JS 直接放在 /templets/default/style/,整目录拦截会让样式失效,需放行静态资源;
  • 放行静态资源时仅允许具体扩展名,禁止 .php: location ~* /templets/.*\.(css|js|jpg|png|gif|woff|svg)$ { allow all; }
  • 移动端模板 /templets/plus/ 也需同步处理;
  • CDN 配置同步拦截 /templets/,否则攻击者从 CDN 边缘仍可获取。
禁止直接访问模板文件看似细节,实则是站点信息泄露防护的关键一环。建议把 /templets//data//include//install/ 四个目录的拦截配置一次性写入 nginx server 块,并把验证步骤加入上线 checklist。当攻击者无法通过模板反推你的站点结构时,针对织梦的常规扫描成功率会大幅下降。