织梦自定义表单如何限制IP访问?

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

使用织梦自带功能(推荐,最简单)

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

织梦自定义表单限制IP
(图片来源网络,侵删)

操作步骤:

  1. 登录后台:使用管理员账号登录您的织梦网站后台。

  2. 进入表单管理:在左侧菜单栏中,找到并点击 【核心】 -> 频道】 -> 【自定义表单】

    (这是一个示意图,您的版本可能略有不同,但路径基本一致)

    织梦自定义表单限制IP
    (图片来源网络,侵删)
  3. 选择并修改表单:在自定义表单列表中,找到您想要设置IP限制的那个表单,点击后面的 【修改】 按钮。

  4. 设置IP限制:在表单修改页面,向下滚动,找到 【允许提交IP】【禁止提交IP】 这两个设置项。

    (这是一个示意图,展示设置项的位置)

  5. 配置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】 功能。
  6. 保存:设置完成后,点击页面底部的 【保存】 按钮即可。

原理:织梦在处理表单提交时,会自动检查提交者的IP地址是否在允许列表中或不在禁止列表中,如果不满足条件,则直接拒绝提交并提示。


修改PHP文件(功能更强大,适用于所有版本)

如果您使用的是较老版本的织梦,或者希望实现更复杂的IP限制逻辑(限制每个IP每天只能提交N次),那么就需要通过修改PHP文件来实现。

核心思路:在处理表单提交的PHP文件中,加入获取提交者IP、判断IP是否在黑名单、以及限制提交频率的代码。

操作步骤:

  1. 找到处理文件:织梦自定义表单提交数据,通常由一个名为 post.php 的文件处理,这个文件位于您的网站根目录下。

  2. 修改 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;
    }
  3. 添加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:组合使用(推荐)

    你可以将黑名单和频率限制结合起来,先检查黑名单,再检查频率。

  4. 获取并保存IP:确保在将数据插入数据库时,将用户的IP地址也一并存入。#@__addonxxx 表中会有一个 ip 字段,在执行插入SQL语句时,将 $user_ip 变量赋值给它。

    // 假设你的表单处理SQL如下
    $inquery = "INSERT INTO `#@__addonxxx`(
        `typeid`, `ip`, `dtime`, `...` 
    ) VALUES (
        '$typeid', '$user_ip', '".time()."', '...'
    )";
    $dsql->ExecuteNoneQuery($inquery);
  5. 上传并测试

    • 保存修改后的 post.php 文件。
    • 通过FTP上传回网站根目录,覆盖原文件。
    • 访问你的表单页面,尝试用被禁止的IP或频繁提交来测试,看是否生效。

总结与建议

方法 优点 缺点 适用场景
方法一(自带功能) 操作简单,安全可靠,官方支持 功能相对固定,无法实现复杂限制(如每日N次) 绝大多数用户的首选,特别是需要快速设置IP黑/白名单的情况。
方法二(修改代码) 功能强大,灵活度高,可实现任何自定义逻辑 需要一定的PHP编程能力,修改后升级织梦时可能被覆盖 对有开发能力的用户,需要实现复杂限制(如防刷、按地区限制等)的场景。

对于绝大多数网站来说,强烈推荐使用方法一,它简单、安全且足够应对大部分需求,只有在方法一无法满足你的特殊要求时,才考虑使用方法二。

-- 展开阅读全文 --
头像
织梦编辑文章打开慢,如何解决?
« 上一篇 01-11
dede织梦织梦更换模板网站
下一篇 » 01-11

相关文章

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

目录[+]