本文目录导读:

- 方案一:基础自检(适用于 UGC 内容极低、成本极小的项目)
- 方案二:基于 AI 的第三方云服务(最推荐,主流方案)
- 方案三:图片 / 视频 / 音频审核
- 方案四:人工审核队列(不可或缺的兜底方案)
- 方案五:前端防堵(提升用户体验)
- 一个完整的审核流程建议
- 需要注意的坑
在 PHP 项目中实现内容审核,通常不是单单靠写几行 PHP 代码就能完成的,而是一个从前端防堵、后端校验、到第三方接口过滤,再到人工审核的完整链路。
以下按成本从低到高、安全性从低到高的顺序,给出几种常见的实现方案,你可以根据项目的敏感度和预算来选择。
基础自检(适用于 UGC 内容极低、成本极小的项目)
在 PHP 后端,用正则或关键词数组对用户输入进行拦截。仅作为第一道防线,极易被绕过。
<?php
// 禁止词列表
$bannedWords = ['赌博', '色情', '代开', '发票', '违禁品'];
function checkContent(string $content): bool {
global $bannedWords;
foreach ($bannedWords as $word) {
if (mb_strpos($content, $word) !== false) {
return false; // 包含敏感词,审核不通过
}
}
return true;
}
// 使用
if (!checkContent($_POST['comment'])) {
http_response_code(403);
echo '内容包含敏感信息,请修改';
exit;
}
// 通过后继续保存...
- 优点:零成本。
- 缺点:无法处理谐音、拼音、拆字(如“du博”)、图片、语音。
基于 AI 的第三方云服务(最推荐,主流方案)
这是目前大部分正规商业项目采用的方式,腾讯云、阿里云、百度云都提供了内容安全服务,支持文本、图片、音频、视频的自动审核。
以 PHP 调用腾讯云“文本内容安全”为例:
- 注册并购买:在腾讯云控制台开通“文本内容安全”服务,获取
SecretId和SecretKey。 - 安装 SDK:
composer require tencentcloud/tencentcloud-sdk-php - PHP 调用代码:
<?php
require_once 'vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Tms\V20201229\TmsClient;
use TencentCloud\Tms\V20201229\Models\TextModerationRequest;
function aiTextCheck(string $content): array {
// 1. 实例化认证对象
$cred = new Credential("你的SecretId", "你的SecretKey");
$httpProfile = new HttpProfile();
$httpProfile->setEndpoint("tms.tencentcloudapi.com");
$clientProfile = new ClientProfile();
$clientProfile->setHttpProfile($httpProfile);
$client = new TmsClient($cred, "ap-guangzhou", $clientProfile);
// 2. 构造请求
$req = new TextModerationRequest();
$req->setContent(base64_encode($content)); // 记得 base64 编码
$req->setBizType("你的BizType(可选)");
// 3. 发送请求
try {
$resp = $client->TextModeration($req);
// 返回结果中是存在 $resp->Label; 和 $resp->Suggestion;
// Suggestion 有三个值:Pass(通过)、Review(疑似,需人工审核)、Block(违规)
return [
'suggestion' => $resp->getSuggestion(),
'label' => $resp->getLabel(),
'detail' => json_decode($resp->getDetail(), true)
];
} catch (\Exception $e) {
// 调用失败时,建议放行(防止误杀),但记录日志
return ['suggestion' => 'Pass', 'error' => $e->getMessage()];
}
}
业务逻辑中的使用:
$result = aiTextCheck($_POST['content']);
if ($result['suggestion'] === 'Block') {
// 直接拒绝:内容违规,禁止发布
http_response_code(400);
echo '内容包含违规信息(' . $result['label'] . ')';
} elseif ($result['suggestion'] === 'Review') {
// 疑似违规:进入人工审核队列,用户看到“内容待审核”
$status = 'pending_audit';
// 存入数据库,标记为待审核
} else {
// Pass:通过,正常发布
$status = 'published';
}
- 优点:准确率极高(90%+),支持多语言、长文本、谐音、变种。
- 缺点:需要付费(文本一般按条计费,约0.1元/千条左右;图片较贵)。
图片 / 视频 / 音频审核
原理同方案二,只是调用不同的 API 接口。
- 图片:调用云服务商的 图片审核(Image Moderation),通常传入图片的 URL 或 Base64。
- 视频/音频:云服务商支持异步审核,你上传文件后,他们会通过回调函数通知你审核结果。
- PHP 示例(上传图片并审核):
// 假设用户上传了一张图片
$imageUrl = uploadToCos($file); // 上传到自己或云存储
// 调用云服务审核接口
$result = aiImageCheck($imageUrl);
if ($result['suggestion'] === 'Block') {
// 违规:删除已上传的图片
deleteUploaded($imageUrl);
exit('图片违规,已拦截');
}
人工审核队列(不可或缺的兜底方案)
AI 不是100%准确的,对于不确定的内容(Review)或重要的UGC(如文章、商品描述),需要引入人工审核后台。
数据库设计示例:
ALTER TABLE user_content
ADD COLUMN status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending: 待审核, approved: 通过, rejected: 拒绝',
ADD COLUMN review_reason VARCHAR(255) DEFAULT NULL COMMENT '拒绝原因',
ADD COLUMN reviewed_by INT DEFAULT NULL COMMENT '审核人ID',
ADD COLUMN reviewed_at DATETIME DEFAULT NULL COMMENT '审核时间';
PHP 后台(Laravel / ThinkPHP 管理面板):
- 待审核列表:列出所有
status = 'pending'的内容。 - 详情页:展示原文+AI给出的
label+疑似敏感词高亮。 - 操作按钮:
通过、拒绝(并填写理由)。
// 审核通过
public function approve($contentId) {
DB::table('user_content')
->where('id', $contentId)
->update([
'status' => 'approved',
'reviewed_by' => auth()->id(),
'reviewed_at' => now()
]);
// 如果内容之前被屏蔽,这里可以触发邮件/通知告知用户已通过
}
// 审核拒绝
public function reject(Request $request, $contentId) {
$request->validate(['reason' => 'required|string']);
DB::table('user_content')
->where('id', $contentId)
->update([
'status' => 'rejected',
'review_reason' => $request->reason,
'reviewed_by' => auth()->id(),
'reviewed_at' => now()
]);
// 通知用户:你的内容因【xxx】被驳回
}
前端防堵(提升用户体验)
注意:前端验证不能替代后端,但可以减少无效请求。
- 敏感词前端提示:用户输入时,实时调用后端接口(或前端敏感词库)标记红色。
- 提交按钮置灰过短、过长或包含明显违规字符,暂时禁用提交按钮。
- 防刷限制:
- 频率限制:同一IP/用户1分钟内只能发1次。
- 内容限制:禁止重复发送完全相同的内容。
- 验证码:对于触发上述限制的用户,弹出滑动或文字验证码。
一个完整的审核流程建议
对于大多数 PHP 商业项目,推荐的实现顺序是:
- 前端校验(关键词提示 + 频率限制)
- PHP 后端 AI 云服务检测(文本 + 图片)
Block→ 直接拒绝,返回错误。Review→ 存入数据库,状态为pending(待人工),让用户端显示“内容正在审核中”。Pass→ 直接发布(或标记为已审核)。
- 人工审核后台:处理 Review 和用户举报的内容。
- 事后拦截即使已经发布,如果有用户举报,触发重新审核流程。
需要注意的坑
- 编码问题:处理中文字符时,务必使用
mb_*函数(如mb_strpos)。 - 接口异常处理:云 API 偶尔会超时或返回异常,建议逻辑:超时时放行(而不是堵死所有用户)。
- 成本控制:图片审核通常比文本贵得多,建议只对用户上传的公开图片(头像、文章封面等)进行 AI 审核,私聊图片可以只做举报处理。
- 法律法规:在中国大陆运营,必须能够配合监管部门提供审核记录(谁审核的、何时审核的、AI 的原报告),建议所有审核结果都写入数据库留存。
如果是个人练手项目,先做方案一(关键词)就够了;如果是正式商业项目,建议直接上方案二(云 API),成本可控且省心。