You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过If-Else控制strip_tags并触发恶意标签检测提示?

问题分析与解决方案

你的代码不生效的核心问题是判断逻辑完全错误,同时IP获取也不对,下面逐个拆解并给出可行方案:

现有代码的问题

  1. 判断条件逻辑颠倒:if(strip_tags($data))是在判断「去除HTML标签后的内容是否非空」——也就是说,用户输入普通文本也会触发错误,而输入纯恶意标签(比如<script></script>)反而不会触发,完全和你的需求相反。
  2. IP获取错误:$_SERVER['SERVER_NAME']是服务器的域名/主机名,不是用户的IP地址,应该用$_SERVER['REMOTE_ADDR'](或适配反向代理的HTTP_X_FORWARDED_FOR)。

实现「仅检测到恶意标签时提示」的方案

要实现这个需求,你需要先明确哪些是恶意标签(比如<script>、<iframe>、<embed>这类可执行或嵌入外部内容的标签),然后针对性检测用户输入中是否包含这些标签。

示例代码(正则匹配恶意标签)

// 定义需要拦截的恶意标签列表,可根据业务需求扩展
$maliciousTags = ['script', 'iframe', 'embed', 'object', 'applet', 'svg'];
// 构造正则:匹配标签的开始/结束,不区分大小写,避免误匹配类似"script.js"的字符串
$detectPattern = '/<\/?(' . implode('|', $maliciousTags) . ')\b/i';

// 检查用户输入是否包含恶意标签
if (preg_match($detectPattern, $data)) {
    // 获取用户真实IP
    $userIp = $_SERVER['REMOTE_ADDR'];
    // 若服务器有反向代理,可尝试获取真实IP(需根据服务器配置调整,注意该头可伪造)
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $userIp = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }

    // 输出错误提示
    echo '<div class="alert alert-danger" role="alert">';
    echo '我们检测到您试图在我们网站使用恶意代码<br>';
    echo 'IP地址: ' . htmlspecialchars($userIp);
    echo '</div>';
}

代码说明

  • 正则表达式/<\/?(' . implode('|', $maliciousTags) . ')\b/i:
    • <\/?匹配标签的开始(<script>)或结束(</script>)
    • \b是单词边界,避免误匹配比如scripty这种包含标签名的普通字符串
    • i表示不区分大小写,拦截<SCRIPT>、<Iframe>这类变种
  • htmlspecialchars($userIp):转义输出内容,避免潜在的XSS风险(即使IP一般不会有问题,养成安全习惯)

进阶方案:使用专业HTML过滤库

如果需要更精准的控制(比如允许<b>、<i>这类安全标签,只拦截恶意标签),推荐使用HTMLPurifier库:

  1. 安装HTMLPurifier(通过Composer或手动下载)
  2. 过滤用户输入后,对比原内容和过滤后的内容,若存在差异且差异是恶意标签被过滤,则提示错误

示例逻辑:

require_once '/path/to/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
// 配置允许的安全标签,比如只允许<b>, <i>
$config->set('HTML.Allowed', 'b,i');

$purifier = new HTMLPurifier($config);
$cleanData = $purifier->purify($data);

// 若原内容和过滤后内容不一致,说明存在被拦截的恶意/未允许标签
if ($data !== $cleanData) {
    // 输出恶意代码提示
    echo '<div class="alert alert-danger" role="alert">';
    echo '我们检测到您试图在我们网站使用恶意代码<br>';
    echo 'IP地址: ' . htmlspecialchars($_SERVER['REMOTE_ADDR']);
    echo '</div>';
}

内容的提问来源于stack exchange,提问作者Newbie Swift Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:10:28