使用织梦自带功能(推荐,最简单)
织梦DedeCMS V5.7及更高版本的自定义表单中,已经内置了“限制IP提交”的功能,这是最直接、最安全的方法。

操作步骤:
-
登录后台:使用管理员账号登录您的织梦网站后台。
-
进入表单管理:在左侧菜单栏中,找到并点击 【核心】 -> 频道】 -> 【自定义表单】。
(这是一个示意图,您的版本可能略有不同,但路径基本一致)
(图片来源网络,侵删) -
选择并修改表单:在自定义表单列表中,找到您想要设置IP限制的那个表单,点击后面的 【修改】 按钮。
-
设置IP限制:在表单修改页面,向下滚动,找到 【允许提交IP】 和 【禁止提交IP】 这两个设置项。
(这是一个示意图,展示设置项的位置)
-
配置IP规则:
(图片来源网络,侵删)- 允许提交IP:在此处填写允许提交表单的IP地址,如果设置了此项,则只有这些IP可以提交,格式为:
- 单个IP:
45.67.89 - IP段:
45.67.*(表示123.45.67.0到123.45.67.255的所有IP) - 多个IP或IP段:用英文逗号隔开,
45.67.89, 123.45.68.*, 123.46.0.0/16
- 单个IP:
- 禁止提交IP:在此处填写禁止提交表单的IP地址,如果设置了此项,则除了这些IP,其他IP都可以提交,格式同上。
使用建议:
- 为了防止恶意攻击,通常建议使用 【禁止提交IP】 功能,您可以在这里填入已知的垃圾IP或IP段。
- 如果您只想让特定用户(如内网用户)使用,则可以使用 【允许提交IP】 功能。
- 允许提交IP:在此处填写允许提交表单的IP地址,如果设置了此项,则只有这些IP可以提交,格式为:
-
保存:设置完成后,点击页面底部的 【保存】 按钮即可。
原理:织梦在处理表单提交时,会自动检查提交者的IP地址是否在允许列表中或不在禁止列表中,如果不满足条件,则直接拒绝提交并提示。
修改PHP文件(功能更强大,适用于所有版本)
如果您使用的是较老版本的织梦,或者希望实现更复杂的IP限制逻辑(限制每个IP每天只能提交N次),那么就需要通过修改PHP文件来实现。
核心思路:在处理表单提交的PHP文件中,加入获取提交者IP、判断IP是否在黑名单、以及限制提交频率的代码。
操作步骤:
-
找到处理文件:织梦自定义表单提交数据,通常由一个名为
post.php的文件处理,这个文件位于您的网站根目录下。 -
修改
post.php文件:- 使用FTP或主机控制面板,下载
post.php文件到本地。 - 用代码编辑器(如VS Code, Sublime Text, Notepad++)打开它。
- 在文件顶部,
<?php之后,添加以下自定义函数,这个函数用于获取用户的真实IP地址。
// 获取真实IP地址的函数 function getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { // 检查是否来自代理 $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // 检查是否来自代理 $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } - 使用FTP或主机控制面板,下载
-
添加IP限制逻辑:在
post.php文件中,找到处理表单数据的逻辑部分,通常在获取dede_addonxxx表单数据之后,但在执行数据库插入操作之前。找到类似这样的代码段:
// ... 前面的代码,获取表单字段值 ... $dede_addon = ${$fieldstr}; // 获取表单数据 // --- 在这里插入我们的IP限制代码 --- $dsql->ExecuteNoneQuery("INSERT INTO `#@__addonxxx` (`id`, `typeid`, `ip`, `...`) VALUES (NULL, '$typeid', '$ip', '...')"); // ... 后面的代码 ...在
--- 在这里插入我们的IP限制代码 ---的位置,添加以下任一或组合逻辑:逻辑A:禁止特定IP提交(黑名单)
// --- IP黑名单限制 --- $banned_ips = array( '123.45.67.89', // 单个IP '192.168.1.100', // 另一个IP '10.0.0.' // IP段,禁止10.0.0.0/24网段的所有IP ); $user_ip = getRealIpAddr(); // 检查IP是否在黑名单中 foreach ($banned_ips as $banned_ip) { if (strpos($user_ip, $banned_ip) === 0) { die('error: 您的IP地址 (' . $user_ip . ') 被禁止提交表单!'); // 返回错误信息并终止脚本 } } // --- IP黑名单限制结束 ---逻辑B:限制每个IP每天只能提交一次(防刷)
// --- IP频率限制 --- $user_ip = getRealIpAddr(); $today = date('Y-m-d'); // 获取今天的日期 $limit_time = strtotime($today); // 获取今天0点的时间戳 // 查询数据库,检查今天该IP是否已经提交过 $row = $dsql->GetOne("SELECT COUNT(*) AS cc FROM `#@__addonxxx` WHERE ip = '$user_ip' AND sendtime > $limit_time"); if ($row['cc'] > 0) { die('error: 您今天已经提交过表单,请勿重复提交!'); // 返回错误信息 } // --- IP频率限制结束 ---逻辑C:组合使用(推荐)
你可以将黑名单和频率限制结合起来,先检查黑名单,再检查频率。
-
获取并保存IP:确保在将数据插入数据库时,将用户的IP地址也一并存入。
#@__addonxxx表中会有一个ip字段,在执行插入SQL语句时,将$user_ip变量赋值给它。// 假设你的表单处理SQL如下 $inquery = "INSERT INTO `#@__addonxxx`( `typeid`, `ip`, `dtime`, `...` ) VALUES ( '$typeid', '$user_ip', '".time()."', '...' )"; $dsql->ExecuteNoneQuery($inquery); -
上传并测试:
- 保存修改后的
post.php文件。 - 通过FTP上传回网站根目录,覆盖原文件。
- 访问你的表单页面,尝试用被禁止的IP或频繁提交来测试,看是否生效。
- 保存修改后的
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一(自带功能) | 操作简单,安全可靠,官方支持 | 功能相对固定,无法实现复杂限制(如每日N次) | 绝大多数用户的首选,特别是需要快速设置IP黑/白名单的情况。 |
| 方法二(修改代码) | 功能强大,灵活度高,可实现任何自定义逻辑 | 需要一定的PHP编程能力,修改后升级织梦时可能被覆盖 | 对有开发能力的用户,需要实现复杂限制(如防刷、按地区限制等)的场景。 |
对于绝大多数网站来说,强烈推荐使用方法一,它简单、安全且足够应对大部分需求,只有在方法一无法满足你的特殊要求时,才考虑使用方法二。
