你刚接手一套苹果CMS V10的模板,首页打开正常,但用户反馈移动端偶尔会弹出博彩广告,有时播放页跳转到陌生站点,排查了一圈服务器和CMS核心,没发现后门,问题大概率出在模板层——广告劫持往往藏在你忽略的模板文件里,下面从模板结构开始,一步步定位并封堵。
先搞清楚模板文件结构
苹果CMS V10模板放在 /template/ 目录下,一套完整模板通常包含:
index.html(首页)list.html(列表页)detail.html(详情页)play.html(播放页)public/目录:head.html、foot.html、header.htmlcss/、js/、images/静态资源ads/或block/广告碎片目录
劫持代码最常藏在 public/head.html、public/foot.html 和 js/ 目录下的自定义脚本里,先全局搜索关键词:eval(、document.write、atob、fromCharCode、appendChild、createElement('script')、window.location,重点检查被压缩成一行的JS文件。
苹果CMS广告劫持排查与模板级防御,从模板结构到SEO标签的完整实战
常用标签调用方法与劫持点
苹果CMS模板标签以 {maccms:xxx} 开头,正常调用示例:
{maccms:vod num="10" type="1" order="desc" by="time"}
<a href="{$vo.vod_url}">{$vo.vod_name}</a>
{/maccms:vod}
广告位通常用 {maccms:adv} 或直接写死HTML,劫持代码往往伪装成“统计代码”插入在 foot.html 底部,
<script src="//cdn.xxx.com/tj.js"></script>
这个 tj.js 可能动态创建iframe或重写链接,处理方式:直接删除不明外链脚本,只保留自己确认的统计代码,同时检查 config/config.php 中是否被注入了 site_wapurl 等跳转参数。
移动端适配技巧
移动端劫持常通过UA判断触发,模板中应有独立的 wap/ 目录或使用响应式,建议在 head.html 中加入:
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
并用CSS媒体查询控制布局,若使用独立移动端模板,确保 wap 目录下的 head.html 与PC端分离,避免PC端恶意脚本在移动端被复用,同时禁用 document.write 写入广告,改用DOM操作并加 rel="nofollow noopener"。
首页/列表页/播放页美化实例
首页:用 {maccms:vod num="8" type="1"} 调用推荐位,外层用grid布局:
<div class="grid">
{maccms:vod num="8" type="1" order="desc" by="hits"}
<div class="card"><a href="{$vo.vod_url}"><img data-src="{$vo.vod_pic}" class="lazy"></a></div>
{/maccms:vod}
</div>
列表页:分页用 {maccms:pages len="10"},配合 list.html 中的 $vo.vod_name 输出。
播放页:播放器调用 {$vo.vod_play_url} 时,务必过滤 javascript: 伪协议,美化上用 plyr 或 dplayer 替换默认播放器,并在 play.html 中加:
<div class="player-wrap">{maccms:vod_play}</div>
SEO优化标签配置
在 head.html 中动态输出:
<meta name="keywords" content="{$vo.vod_name},{$maccms.site_keywords}">
<meta name="description" content="{$vo.vod_blurb}">
<link rel="canonical" href="{$maccms.site_url}{$vo.vod_url}">
列表页用 {$maccms.type_name} 做标题,详情页用 $vo.vod_name,同时生成sitemap时排除被劫持的跳转链接。
封堵劫持的最终步骤
- 备份原模板,用Beyond Compare对比官方默认模板,找出多出的JS文件。
- 删除所有非自己添加的外链脚本,尤其是
foot.html末尾。 - 在
index.php入口加header("X-Frame-Options: SAMEORIGIN");防止iframe嵌套。 - 检查
.htaccess是否被加了302跳转规则。 - 重新生成缓存,清除
runtime/目录。
按以上步骤操作后,广告劫持基本能被清除,模板开发者的底线是:每一行JS都要知道它从哪来、干什么,别让一个 foot.html 里的陌生script毁掉整站。



发表评论