能否通过If-Else控制strip_tags并触发恶意标签检测提示?
问题分析与解决方案
你的代码不生效的核心问题是判断逻辑完全错误,同时IP获取也不对,下面逐个拆解并给出可行方案:
现有代码的问题
- 判断条件逻辑颠倒:
if(strip_tags($data))是在判断「去除HTML标签后的内容是否非空」——也就是说,用户输入普通文本也会触发错误,而输入纯恶意标签(比如<script></script>)反而不会触发,完全和你的需求相反。 - 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库:
- 安装HTMLPurifier(通过Composer或手动下载)
- 过滤用户输入后,对比原内容和过滤后的内容,若存在差异且差异是恶意标签被过滤,则提示错误
示例逻辑:
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
相关产品推荐
相关产品推荐

