织梦m list.php tid漏洞如何利用?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 织梦建站 正文

文件位置与作用

  • 文件位置: /m/list.php
  • 核心作用: 这是织梦DedeCMS移动端的栏目列表页,当你在手机上浏览网站,点击一个栏目时,通常会跳转到这个页面,并显示该栏目下的所有文章列表。

tid 参数是什么?

tid"Type ID" 的缩写,即栏目ID,它是 list.php 文件最关键的一个参数,用来告诉系统:“请显示ID为 tid 的这个栏目下的文章列表”。

织梦 m list.php tid
(图片来源网络,侵删)

访问示例: 假设你的网站有一个“公司新闻”栏目,它的ID是 5,那么在移动端访问这个栏目列表的URL通常会是: http://你的域名.com/m/list.php?tid=5

list.php 如何处理 tid 参数?

当用户访问 m/list.php?tid=5 时,服务器执行 list.php 文件,该文件内部会经历以下几个核心步骤来处理 tid

步骤一: 接收和验证 tid

文件首先会从URL中获取 tid 的值,并进行一些基本的安全处理。

// 在 list.php 文件的开头部分
if(!empty($tid))
{
    $tid = preg_replace("#[^0-9]#", "", $tid); // 移除所有非数字字符,只保留数字ID
}

这行代码非常重要,它防止了SQL注入等安全问题,即使用户传入 tid=5; DROP TABLE dede_archives;,经过这行处理后,$tid 也只会变成 5

织梦 m list.php tid
(图片来源网络,侵删)

步骤二: 获取栏目信息

系统会使用 $tid 去查询数据库,获取这个栏目的详细信息,比如栏目名称、栏目模板、上级栏目等。

// 获取栏目信息
$typeinfo = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id='$tid'");
// 检查栏目是否存在
if(!is_array($typeinfo))
{
    ShowMsg('您指定的栏目不存在!', '-1');
    exit();
}

这里查询的是 #@__arctype 表(即 dede_arctype 表),这是存储所有栏目信息的核心表,如果查询不到记录,说明这个栏目ID是无效的,会提示错误并退出。

步骤三: 调用对应的列表模板

根据上一步获取到的栏目信息,特别是 listtemp 字段(或 tempindex 等字段,取决于版本和配置),系统会决定使用哪个HTML模板文件来渲染这个列表页。

// 获取栏目模板
$ntype = $typeinfo['nativetype'];
$typedir = $typeinfo['typedir'];
$templet = $typeinfo['listtemplet']; // 通常这个字段存储模板路径
// 如果没有指定模板,则使用默认模板
if(empty($templet))
{
    $templet = $cfg_basedir.$cfg_templets_dir."/".$cfg_df_style."/list_default.htm";
}
else
{
    $templet = $cfg_basedir.$typedir.'/'.$templet;
}
// ... 加载模板并解析 ...
  • $ntype: 栏目类型,如 son (普通栏目), self (外部链接) 等。
  • $typedir: 栏目目录,用于生成URL。
  • $templet: 最终确定的模板文件路径。

步骤四: 查询并传递文章列表数据

这是最核心的一步,系统会根据 $tid 和其他参数(如分页 page、每页显示数量 pagesize 等)去查询 #@__archives 表(文章主表)和 #@__arctiny 表(文章摘要表),获取该栏目下的所有文章列表。

织梦 m list.php tid
(图片来源网络,侵删)
// 构建查询SQL
$sql = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
              tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
        FROM `#@__archives` arc
        LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
        WHERE arc.typeid IN ($tid) $orquery $addsql ORDER BY arc.sortrank DESC $ordersql";
// 执行查询
$dsql->SetQuery($sql);
$dsql->Execute('al');
// 循环获取每一篇文章数据
while($row = $dsql->GetArray('al'))
{
    // 对文章数据进行处理,如生成URL、处理图片等
    $row['arcurl'] = GetFileUrl($row['id'],$row['typeid'],$row['senddate'],$row['title'],$row['ismake'],
                                $row['arcrank'],$row['namerule'],$row['typedir'],$row money);
    // ... 其他处理 ...
    // 将处理好的文章数据存入一个数组,准备传递给模板
    $list[] = $row;
}
// 将数据传递给模板
$pv->Fields = $typeinfo;
$pv->Fields['list'] = $list; // 将文章列表数组赋值给模板变量 'list'
$pv->SetTemplet($templet);   // 设置要使用的模板文件
$pv->Display();              // 解析并输出模板
  • $tid: 这里直接用在 WHERE 子句中,WHERE arc.typeid IN ($tid),注意,这里用的是 IN 而不是 ,是为了兼容“包含子栏目”的情况(见下文)。
  • $orquery: 一个非常重要的变量,用于处理“包含子栏目”,如果该栏目设置了“包含子栏目”,$orquery 的值就会变成 OR arc.typeid IN (子栏目ID1,子栏目ID2,...),从而把子栏目下的文章也一并查询出来。
  • $list: 最终传递给模板的文章列表数据。

步骤五: 模板渲染与输出

系统会加载在第3步中确定的模板文件(list_default.htm),并将 $typeinfo(栏目信息)和 $list(文章列表)等变量传递给模板,模板引擎会解析这些变量,生成最终的HTML页面并返回给用户的浏览器。

模板文件中的调用

在移动端的列表模板文件(如 /m/templets/default/list_default.htm)中,你会看到类似这样的标签来使用 $tid 传递过来的数据:

<h1>{dede:field name='typename'/}</h1>  <!-- 显示栏目名称,来自$typeinfo -->
<ul>
    {dede:list pagesize='10'}  <!-- 循环输出文章列表,默认10条 -->
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>  <!-- 文章链接和标题 -->
            <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> <!-- 发布日期 -->
        </li>
    {/dede:list}
</ul>
{dede:pagelist listitem='info,index,end,pre,next,pageno' listsize='5'/}  <!-- 分页条 -->

常见问题与排查

如果你的 m/list.php?tid=x 页面出现问题,可以从以下几点排查:

  1. 404页面不存在:

    • 检查 tid 是否正确,该栏目是否存在。
    • 检查服务器的伪静态规则是否正确配置,织梦移动端通常需要重写URL。
    • 检查 list.php 文件是否存在。
  2. 为空或错误:

    • 检查该栏目下是否已经发布了文章,并且文章是“已审核”状态。
    • 检查栏目是否设置了“外部链接”或“单页文档”,如果是,list.php 的行为会不同。
    • 检查对应的列表模板文件是否存在,并且模板标签语法是否正确。
  3. 样式错乱:

    • 检查模板文件中引用的CSS和JS路径是否正确,移动端模板通常使用 /m/ 目录下的资源。
项目 说明
文件 /m/list.php
参数 tid (Type ID, 栏目ID)
功能 根据传入的 tid,查询指定栏目的文章列表,并调用相应的模板进行渲染。
核心流程 接收tid -> 验证tid -> 获取栏目信息 -> 确定模板 -> 查询文章数据 -> 渲染模板并输出。
模板标签 {dede:field name='typename'} (栏目名), {dede:list} (文章列表), {dede:pagelist} (分页)。

理解了 m/list.phptid 的关系,你就掌握了织梦CMS移动端内容列表展示的核心机制。

-- 展开阅读全文 --
头像
梦织系统与WordPress,哪个更适合建站?
« 上一篇 昨天
织梦古典水墨学校模板如何适配dedecms?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]