admin 发表于 2023-1-29 22:58:38

Discuz! X3.4 附件无法删除问题排查指引

一. 问题背景:

在 Discuz! X3.4 Release 20221220 版本中引入了针对附件删除接口的 CSRF 规避措施,由于手机版部分插件、模板以及部分 PC 插件自行实现了附件删除接口调用,因此可能导致该部分插件、模板使用异常。
本排查指引将告知如何排查相关问题。

二. 模板无法删除附件排查
1. 在 template 目录下找到出现问题的模板文件夹,将文件夹下载到本地计算机,并做好备份。
2. 使用 EditPlus / Notepad++ 等工具对整个文件夹下的所有文件进行搜索,搜索关键词为 deleteattach 。
3. 如果可以找到 deleteattach,则参考以下示例代码对文件进行修改。
4. 修改完成后将文件夹上传回服务器,在后台更新缓存后再试。

例如修改之前的代码:
url:'forum.php?mod=ajax&action=deleteattach&inajax=yes&aids[]=' + obj.attr('aid'),
修改后:
url:'forum.php?mod=ajax&action=deleteattach&inajax=yes&formhash={FORMHASH}&aids[]=' + obj.attr('aid'),

三. 插件无法删除附件排查
1. 在 source/plugin 目录下找到出现问题的插件文件夹,将文件夹下载到本地计算机,并做好备份。
2. 使用 EditPlus / Notepad++ 等工具对整个文件夹下的所有文件进行搜索,搜索关键词为 deleteattach 。
3. 如果可以找到 deleteattach,则参考以下示例代码对文件进行修改。
4. 修改完成后将文件夹上传回服务器,在后台更新缓存后再试。

例如修改之前的代码:
$url = 'forum.php?mod=ajax&action=deleteattach&inajax=yes&aids[]='.$aid;
修改后:
$url = 'forum.php?mod=ajax&action=deleteattach&inajax=yes&formhash='.FORMHASH.'&aids[]='.$aid;

附录:关闭接口校验
如果实在是无法排查到上述文件,又由于各种原因无法替换插件或者联系插件作者进行升级,可以采取以下方案强制修改代码关闭校验。
关闭附件删除接口安全校验可能导致部分恶意攻击者在网站安插恶意代码导致附件被删除的风险,由此导致的安全风险由站点自行承担。
回退老版本或选择放弃升级新版本不会解除该接口的安全风险,反而由于其他漏洞未被正确修复给站点造成更大的安全风险。

1. 该文件位于 source/module/forum/forum_ajax.php ,请将文件下载到本地计算机,并做好备份。
2. 使用 EditPlus / Notepad++ 等工具对文件进行搜索,搜索关键词为 deleteattach 。
3. 找到下方所指示的代码并按指引进行修改。
4. 修改完成后将文件上传回服务器,在后台更新缓存后再试。

修改前:
if(isset($_GET['aids']) && isset($_GET['formhash']) && formhash() == $_GET['formhash']) {
修改后:
if(isset($_GET['aids'])) {

teliy 发表于 2023-1-30 13:50:51

非常棒的教程!

Discuz智能体 发表于 2025-3-18 19:01:12

感谢您提供的问题背景和排查指引。以下是对Discuz! X3.4版本中附件无法删除问题的详细排查和解决方案:

### 一、问题背景
在Discuz! X3.4 Release 20221220版本中,引入了针对附件删除接口的CSRF(跨站请求伪造)规避措施。由于手机版部分插件、模板以及部分PC插件自行实现了附件删除接口调用,可能导致这些插件或模板在使用时出现异常。

### 二、模板无法删除附件排查
1. **定位问题模板**:
   - 在`template`目录下找到出现问题的模板文件夹,下载到本地并备份。

2. **搜索关键词**:
   - 使用EditPlus、Notepad++等工具对整个文件夹下的所有文件进行搜索,关键词为`deleteattach`。

3. **修改代码**:
   - 如果找到`deleteattach`,参考以下示例代码进行修改:
   // 修改前
   url:'forum.php?mod=ajax&action=deleteattach&inajax=yes&aids=' + obj.attr('aid'),
   
   // 修改后
   url:'forum.php?mod=ajax&action=deleteattach&inajax=yes&formhash={FORMHASH}&aids=' + obj.attr('aid'),

4. **上传并更新缓存**:
   - 修改完成后,将文件夹上传回服务器,并在后台更新缓存。

### 三、插件无法删除附件排查
1. **定位问题插件**:
   - 在`source/plugin`目录下找到出现问题的插件文件夹,下载到本地并备份。

2. **搜索关键词**:
   - 使用EditPlus、Notepad++等工具对整个文件夹下的所有文件进行搜索,关键词为`deleteattach`。

3. **修改代码**:
   - 如果找到`deleteattach`,参考以下示例代码进行修改:
   // 修改前
   $url = 'forum.php?mod=ajax&action=deleteattach&inajax=yes&aids='.$aid;
   
   // 修改后
   $url = 'forum.php?mod=ajax&action=deleteattach&inajax=yes&formhash='.FORMHASH.'&aids='.$aid;

4. **上传并更新缓存**:
   - 修改完成后,将文件夹上传回服务器,并在后台更新缓存。

### 四、附录:关闭接口校验
如果无法排查到上述文件,且无法替换插件或联系插件作者进行升级,可以采取以下方案强制修改代码关闭校验。**请注意,关闭附件删除接口安全校验可能导致部分恶意攻击者在网站安插恶意代码导致附件被删除的风险,由此导致的安全风险由站点自行承担。**

1. **定位文件**:
   - 该文件位于`source/module/forum/forum_ajax.php`,请将文件下载到本地并备份。

2. **搜索关键词**:
   - 使用EditPlus、Notepad++等工具对文件进行搜索,关键词为`deleteattach`。

3. **修改代码**:
   - 找到下方所指示的代码并按指引进行修改:
   // 修改前
   if(isset($_GET) && isset($_GET) && formhash() == $_GET) {
   
   // 修改后
   if(isset($_GET)) {

4. **上传并更新缓存**:
   - 修改完成后,将文件上传回服务器,并在后台更新缓存。

### 五、总结
通过以上步骤,您可以排查并解决Discuz! X3.4版本中附件无法删除的问题。如果您在操作过程中遇到任何问题,欢迎随时联系DZ插件网(https://www.dz-x.net/)的技术支持团队,我们将竭诚为您提供帮助。

希望以上内容对您有所帮助!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz! X3.4 附件无法删除问题排查指引